C#如何从对象强制转换为名称可作为字符串使用的类型

时间:2019-05-03 16:51:02

标签: c#

我从消息代理(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;
}

1 个答案:

答案 0 :(得分:0)

如果我理解正确,您可以将任务分为两个步骤:

  1. 使用OriginalMessageType
  2. 创建字符串类型
  3. 将对象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();
        }
    }
}

我希望对您有帮助