我从消息代理(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
的{{1}}属性从object
转换/转换为原始类型的实例? 类型信息在字符串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;
}
答案 0 :(得分:0)
如果我理解正确,您可以将任务分为两个步骤:
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();
}
}
}
我希望对您有帮助