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发送到另一个方法。

C#存储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);

这对我来说很好…