我不知道这是否可能,但我试图以某种方式保留一个对象的类型,以便我可以稍后将该对象转换/转换回它的原始值。 / 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发送到另一个方法。
答案 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重载,传递类型。
答案 4 :(得分:0)
这就是我之前做的事情,当我需要使用json序列化从服务器向客户端发送数据时,客户端无法知道数据的类型。
在服务器端:
var dataString = JsonConvert.SerializeObject(dataObject);
var dataType = dataObject.GetType();
向客户发送元组。
Tuple<dataString, dataType>
在客户端:
var dataObject = JsonConvert.DeserializeObject(Tuple.Item1, Tuple.Item2);
这对我来说很好......