2017-03-20 81 views
1

我有一個使用JSON保存消息的消息隊列,以及一組按類型鍵入的消息接收者。我有這些方法從隊列中添加和刪除項目:如何在.NET中保存對泛型類型的引用?

public void AddToQueue<T>(T message) 
{ 
    var msg = JObject.FromObject(message); 

    msg["_type"] = typeof(T).AssemblyQualifiedName; 

    notificationQueue.PushBack(msg.ToString()); 
} 

public void DispatchFromQueue() 
{ 
    var notification = notificationQueue.PopFront(); 
    if(notification != null) 
    { 
     var jobj = JObject.Parse(notification); 
     var type = Type.GetType(jobj["_type"].Value<string>()); 

     var msg = JsonConvert.DeserializeObject(notification, type); 

     // handle message 
    } 
} 

我相信這會工作爲普通類型,如stringMyCustomClass。但是,我相信它會因泛型類型(例如MyGenericClass<T>)或像ClassA<ClassB<ClassC>>這樣的瘋狂案例而失敗。

是否有一種獲取/解析具有內置通用參數的類型名稱的標準方法?如果沒有,我怎麼能手動做到這一點?

+0

「.GetType」是否獲取表示類型的「Type」,即Type的類型? – dcg

+0

它確實,但我需要序列化它,然後反序列化它 –

+0

[MSDN](https://msdn.microsoft.com/en-us/library/w3f99sx1(v = vs.110).aspx)for該重載狀態的typeName是**「要獲得的類型的程序集限定名稱」。**因此,原則上應該沒有任何問題。順便說一句,我不知道超載,我想你每天都會學到新的東西:) – dcg

回答

1

而不是相信的時候,最好進行測試,在這種情況下,不會花太多時間:

var message = new Tuple<string, Tuple<int, HashSet<double>>>("test", new Tuple<int, HashSet<double>>(2, new HashSet<double>() { 2d, 3d }));    
var msg = JObject.FromObject(message); 
msg["_type"] = message.GetType().AssemblyQualifiedName; 
var notification = msg.ToString(); 
var parsed = JObject.Parse(notification); 
var type = Type.GetType(parsed["_type"].Value<string>()); 
var back = JsonConvert.DeserializeObject(notification, type); 
// all is fine here 

這是因爲泛型類型的類型名稱已經包含了所有必要的信息:

System.Tuple`2[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, 
PublicKeyToken=b77a5c561934e089],[System.Tuple`2[[System.Int32, mscorlib, 
Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089], 
[System.Collections.Generic.HashSet`1[[System.Double, mscorlib,  
Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], System.Core, 
Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], mscorlib, 
Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], mscorlib, 
Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 

請注意,由於JSON.NET處理類型爲IDictionary的方式,因此如果消息是字典(或者會失敗或反序列化不正確),則您的方法將不起作用。

+0

哦,拍攝,我基於閱讀MSDN頁面的信念,https://msdn.microsoft.com/en-us/library /system.type.assemblyqualifiedname(v=vs.110).aspx。但是,我讀錯了。 –

相關問題