C#存储T的值以便稍后转换回
我不知道这是否可行,但我正试图以某种方式保持对象的类型,以便稍后可以将该对象转换/强制转换回其原始值 基本上,我有一个使用RabbitMQ的消息传递引擎。我收到一条消息,该消息是一个.net对象,其中包含一个JSON字符串,我需要将其序列化回一个.net对象/类,但我希望它尽可能通用,因此希望将该claas的类型作为类型或字符串与消息所包含的对象一起发送 对象:C#存储T的值以便稍后转换回,c#,json,generics,C#,Json,Generics,我不知道这是否可行,但我正试图以某种方式保持对象的类型,以便稍后可以将该对象转换/强制转换回其原始值 基本上,我有一个使用RabbitMQ的消息传递引擎。我收到一条消息,该消息是一个.net对象,其中包含一个JSON字符串,我需要将其序列化回一个.net对象/类,但我希望它尽可能通用,因此希望将该claas的类型作为类型或字符串与消息所包含的对象一起发送 对象: public Message { public string JsonObject { get; set; } pu
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);
Message Message=new Message();//实际上,我在方法中以参数的形式接收消息
var message=JsonConvert.DeserializeObject(futureMessage.JsonObject);
在
部分中,我收到一个错误“找不到类型或命名空间名称“type”。(是否缺少using指令或程序集引用?)
随后在我的代码中:
DoSomething<T>(message);
DoSomething(消息);
其中T需要与前面存储在消息对象中的类型相同
我想做的是可能的吗
编辑:删除不必要的Type=Type.GetType(message.MessageType)
行
编辑:我需要该泛型类型,因为我希望稍后在代码中将该类型T发送到另一个方法。您可能希望使用另一个重载的
反序列化对象
:
var message = JsonConvert.DeserializeObject(
futureMessage.JsonObject, message.MessageType);
要使用message.MessageType
作为类型参数调用泛型方法,可以使用反射或动态调用:
DoSomething((dynamic)message);
请注意,在这种情况下,将在运行时选择重载,因为您将丢失强类型。使用重载:
return (Message)JsonConvert.DeserializeObject(message,message.GetType());
正如其他人提到的,您似乎试图使用泛型JsonConvert.DeserializeObject()方法,该方法要求您传递泛型类型T 您可以调用反序列化对象重载,传递类型
您可以使用以下命令进行通用方法调用:
typeof(DoSomethingClass).GetMethod("DoSomething")
.MakeGenericMethod(message.MessageType).Invoke(InstanceOfDoSomething, message);
这就是我前一段时间所做的,当时我需要使用json序列化将数据从服务器发送到客户机,客户机无法知道数据的类型 在服务器端:
var dataString = JsonConvert.SerializeObject(dataObject);
var dataType = dataObject.GetType();
向客户端发送一个元组
Tuple<dataString, dataType>
这对我来说效果很好…你能不能只使用
对象
作为类型?这似乎是可行的,但我确实需要以某种方式获得泛型类型t,因为我需要稍后在我的代码中将它发送给另一个方法。@MRT更新了答案。我还是不完全明白你想用这个达到什么目的。我看不到类型参数在任何地方是如何实际使用的。我有一个非常通用的方法,在我的代码中共享,它接受任何要转换为JSON并放入RabbitMQ队列的对象。我不想硬编码类型,因为这会限制我的实现。我现在正在处理的这部分代码实际上是我之前收到的一条消息,我将它包装在另一个对象中,保存在一个单独的队列中,稍后再添加回它来自的原始队列。
var dataObject = JsonConvert.DeserializeObject(Tuple.Item1, Tuple.Item2);