Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#存储T的值以便稍后转换回_C#_Json_Generics - Fatal编程技术网

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

C#存储T的值以便稍后转换回,c#,json,generics,C#,Json,Generics,我不知道这是否可行,但我正试图以某种方式保持对象的类型,以便稍后可以将该对象转换/强制转换回其原始值 基本上,我有一个使用RabbitMQ的消息传递引擎。我收到一条消息,该消息是一个.net对象,其中包含一个JSON字符串,我需要将其序列化回一个.net对象/类,但我希望它尽可能通用,因此希望将该claas的类型作为类型或字符串与消息所包含的对象一起发送 对象: public Message { public string JsonObject { get; set; } pu

我不知道这是否可行,但我正试图以某种方式保持对象的类型,以便稍后可以将该对象转换/强制转换回其原始值

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

对象:

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);