![](/img/trans.png)
[英]How to access a dynamically created text box in C# whose name is available in string?
[英]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;
}
如果我正確理解,可以將任務分為兩個步驟:
OriginalMessageType
創建字符串類型 OriginalMessage
轉換為所需的類型 我想您只能使用switch
語句並將對象轉換為特定類型,但是您的任務可能有所不同,因此
要從字符串創建類型:
Type type = Type.GetType("YourNamespace.YourClass, YourAssembly");
如果類型在mscorlib
或調用程序集中,則可以僅使用類型的名稱:
Type myType1 = Type.GetType("System.Int32");
有關更多信息,請參見Type.GetType
。
若要轉換對象,我建議使用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.