2014-09-01 59 views
1

我不知道這是否可能,但我試圖以某種方式保持一個對象的類型,以便我可以轉換/將該對象轉換回它的原始值後來。C#存儲值爲T稍後轉換

基本上我有一個使用RabbitMQ的消息傳遞引擎。我收到一個消息,它是一個帶有JSON字符串的.net對象,我需要將它序列化回.net對象/類,但是我希望儘可能通用,並且因此希望發送類型爲克拉斯無論是作爲一個類型或作爲與對象沿一個字符串的消息包含在

目的:

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' 。

DoSomething<T>(message); 

其中T必須是同一類型,我存儲在我的Message對象更早:在我的代碼以後(是否缺少或使用指令或程序集引用一個?)」

然後。在

是什麼,我試圖做甚至有可能

編輯:刪除不必要的Type type = Type.GetType(message.MessageType)

編輯:我需要個在泛型類型,因爲我想發送該類型T到另一個方法稍後在我的代碼。

+1

你就不能使用'object'類型? – Sam 2014-09-01 11:43:14

回答

1

可以使用使通用的方法調用客戶端無法知道數據的類型。

在服務器端:

var dataString = JsonConvert.SerializeObject(dataObject); 
var dataType = dataObject.GetType(); 

發送到客戶端的元組。

Tuple<dataString, dataType> 

在客戶端:

var dataObject = JsonConvert.DeserializeObject(Tuple.Item1, Tuple.Item2); 

這工作得很好,我...

+0

謝謝你,這工作完美! – Ebbs 2014-09-02 06:27:32

2

你可能想使用的DeserializeObject另一個重載:

var message = JsonConvert.DeserializeObject(
     futureMessage.JsonObject, message.MessageType); 

要使用message.MessageType調用一個泛型方法作爲一個類型參數,你可以使用反射或動態調用:

DoSomething((dynamic)message); 

注意在這種情況下,運行時會選擇超載,因爲您正在失去強大的輸入。

+0

這似乎工作,但我確實需要以某種方式獲得該泛型類型T,因爲我需要稍後在我的代碼中將其發送到另一個方法。 – Ebbs 2014-09-01 11:53:30

+0

@MrThursday更新時通過。我仍然不完全明白你想用這個做什麼。我看不出在任何地方實際使用的類型參數。 – Athari 2014-09-01 12:06:37

+0

我有一個非常通用的方法,在我的代碼中共享,它接受要轉換爲JSON的任何對象放入RabbitMQ隊列。我不想硬編碼類型,因爲這會限制我的實現。現在我正在處理的這部分代碼實際上是我之前收到的一條消息,我將其包裝在另一個對象中,以保存在一個單獨的隊列中,並稍後添加到它所來自的原始隊列中。 – Ebbs 2014-09-01 12:14:53

0

使用過載:

return (Message)JsonConvert.DeserializeObject(message,message.GetType()); 
0

正如其他人所說,它看起來像你試圖用這需要你的通用JsonConvert.DeserializeObject()方法來傳遞一個泛型類型T.

你可以調用DeserializeObject重載,傳遞類型。

typeof(DoSomethingClass).GetMethod("DoSomething") 
.MakeGenericMethod(message.MessageType).Invoke(InstanceOfDoSomething, message);