C#存储T值以便稍后转换回来

时间:2014-09-01 11:37:08

标签: c# json generics

我不知道这是否可能,但我试图以某种方式保留一个对象的类型,以便我可以稍后将该对象转换/转换回它的原始值。 / p>

基本上我有一个使用RabbitMQ的消息传递引擎。我收到一条消息,它是一个带有JSON字符串的.net对象,我需要将其序列化回.net对象/类,但我想保持它尽可能通用,因此希望发送它的类型claas既可以作为Type,也可以作为字符串以及消息所包含的对象。

对象:

public Message
{
    public string JsonObject { get; set; }

    public Type MessageType { get; set; }
}

序列化:

Message message = new Message(); // I actually receive message as a param in a Method

var message = JsonConvert.DeserializeObject<message.MessageType>(futureMessage.JsonObject);

<type>部分,我收到错误&#34;类型或命名空间名称&#39;键入&#39;无法找到。 (您是丢失了还是使用指令或汇编引用?)&#34;

然后在我的代码中:

DoSomething<T>(message);

其中T需要与我之前在Message对象中存储的Type相同。

我想做的甚至可能吗?

修改:删除了不必要的Type type = Type.GetType(message.MessageType)

编辑:我需要那个泛型类型,因为我希望稍后在我的代码中将该类型T发送到另一个方法。

5 个答案:

答案 0 :(得分:2)

您可能想要使用DeserializeObject的另一个重载:

var message = JsonConvert.DeserializeObject(
        futureMessage.JsonObject, message.MessageType);

要使用message.MessageType作为类型参数调用泛型方法,您可以使用反射或动态调用:

DoSomething((dynamic)message);

请注意,在这种情况下,将在运行时选择重载,因为您正在失去强类型。

答案 1 :(得分:1)

您可以使用以下方法进行泛型方法调用:

typeof(DoSomethingClass).GetMethod("DoSomething")
.MakeGenericMethod(message.MessageType).Invoke(InstanceOfDoSomething, message);

答案 2 :(得分:0)

使用重载:

 return (Message)JsonConvert.DeserializeObject(message,message.GetType()); 

答案 3 :(得分:0)

正如其他人所提到的,看起来你试图使用通用的JsonConvert.DeserializeObject()方法,它要求你传递泛型类型T.

您可以调用DeserializeObject重载,传递类型。

http://james.newtonking.com/json/help/?topic=html/M_Newtonsoft_Json_JsonConvert_DeserializeObject_2.htm

答案 4 :(得分:0)

这就是我之前做的事情,当我需要使用json序列化从服务器向客户端发送数据时,客户端无法知道数据的类型。

在服务器端:

var dataString = JsonConvert.SerializeObject(dataObject);
var dataType   = dataObject.GetType();

向客户发送元组。

Tuple<dataString, dataType>

在客户端:

var dataObject = JsonConvert.DeserializeObject(Tuple.Item1, Tuple.Item2);

这对我来说很好......