C#存储T的值,稍后再转换回来
本文关键字:转换 回来 存储 的值 | 更新日期: 2023-09-27 18:20:15
我不知道这是否可能,但我正在尝试以某种方式保留对象的Type,以便以后可以将该对象转换/强制转换回其原始值。
基本上,我有一个使用RabbitMQ的消息引擎。我收到一条消息,它是一个.net对象,里面有一个JSON字符串,我需要将其序列化回.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>
部分,我收到一个错误"找不到类型或命名空间名称"type"。(您是否缺少using指令或程序集引用?)"
然后稍后在我的代码中:
DoSomething<T>(message);
其中T需要与我之前存储在Message对象中的类型相同。
我想做的事情有可能吗?
编辑:删除不必要的Type type = Type.GetType(message.MessageType)
行
编辑:我需要那个泛型类型,因为我想稍后在代码中将那个类型T发送到另一个方法。
您可能想要使用DeserializeObject
:的另一个过载
var message = JsonConvert.DeserializeObject(
futureMessage.JsonObject, message.MessageType);
要调用以message.MessageType
作为类型参数的泛型方法,可以使用反射或动态调用:
DoSomething((dynamic)message);
请注意,在这种情况下,将在运行时选择重载,因为您将失去强类型。
您可以使用进行泛型方法调用
typeof(DoSomethingClass).GetMethod("DoSomething")
.MakeGenericMethod(message.MessageType).Invoke(InstanceOfDoSomething, message);
使用重载:
return (Message)JsonConvert.DeserializeObject(message,message.GetType());
正如其他人所提到的,它看起来像是你试图使用泛型JsonConvert.DescializeObject()方法,该方法需要你传递一个泛型类型T。
您可以调用DeserializeObject重载,传递类型。
http://james.newtonking.com/json/help/?topic=html/M_Newtonsoft_Json_JsonConvert_DeserializeObject_2.htm
这是我不久前所做的,当时我需要用json序列化将数据从服务器发送到客户端,而客户端无法知道数据的类型。
在服务器端:
var dataString = JsonConvert.SerializeObject(dataObject);
var dataType = dataObject.GetType();
向客户发送一个Tuple。
Tuple<dataString, dataType>
在客户端:
var dataObject = JsonConvert.DeserializeObject(Tuple.Item1, Tuple.Item2);
这对我来说很好…