簡體   English   中英

C#如何從對象強制轉換為名稱可作為字符串使用的類型

[英]C# How to cast from object to a type whose name is available as string

我從消息代理 (RabbitMQ)獲得一個對象,該對象的簽名類似於以下內容:

public class ErrorMessage
{
    public string MessageId { get; set; }
    public string Publisher { get; set; }
    public string Error { get; set; }
    public string OriginalMessageType { get; set; }
    public object OriginalMessage { get; set; }
}

背景資料

我有一個包含所有消息類型定義的C#DLL。 消息不是專門為C#設計的,因為使用多種編程語言編寫了使用者。 因此,消息對象不包含泛型和其他C#好東西。 對於C#,我使用EasyNetQ庫對消息進行序列化/反序列化,並作為RabbitMQ客戶端驅動程序的包裝。

問題/問題

C#中有什么方法可以 OriginalMessage屬性從object 轉換OriginalMessage 類型實例 類型信息OriginalMessageType屬性中以字符串形式提供

我在消息處理程序方法中嘗試了類似的操作(這當然是行不通的...)

public static Task ProcessErrorMessage(IMessage<ErrorMsg> message, MessageReceivedInfo info)
{
    var t = Type.GetType(message.Body.OriginalMessageType);
    var origMsg = (t)message.Body.OriginalMessageType; //get the original message which caused the error
    var someProperty = origMsg.SomeProperty;
    // etc.
    // process the message using properties of origMsg
    // ...

    return Task.CompletedTask;
}

如果我正確理解,可以將任務分為兩個步驟:

  1. 使用OriginalMessageType創建字符串類型
  2. 將對象OriginalMessage轉換為所需的類型

我想您只能使用switch語句並將對象轉換為特定類型,但是您的任務可能有所不同,因此

第1步

要從字符串創建類型:

Type type = Type.GetType("YourNamespace.YourClass, YourAssembly");

如果類型在mscorlib或調用程序集中,則可以僅使用類型的名稱:

Type myType1 = Type.GetType("System.Int32");

有關更多信息,請參見Type.GetType

第2步

若要轉換對象,我建議使用Convert.ChangeType

返回指定類型的對象,其值等於指定的對象。

所以看起來像這樣

dynamic origMsg = (dynamic) Convert.ChangeType(OriginalMessage, YourType); 

小例子

using System;

namespace ConsoleApp12
{
    class A
    {
        public int P1 { get; set; }
    }

    class Program
    {
        static void Main(string[] args)
        {
            A myvariable = new A
            {
                P1 = 1,
            };

            object obj = myvariable;
            string typename = "ConsoleApp12.A";

            Type type = Type.GetType(typename);

            dynamic origMsg = (dynamic)Convert.ChangeType(obj, type);

            Console.WriteLine(origMsg.P1);
            Console.ReadKey();
        }
    }
}

希望對您有幫助

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM