2017-03-20 11 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 
    } 
} 

私はこれらがstringまたはMyCustomClassのように、通常のタイプのために働くだろうと信じています。しかし、私はMyGenericClass<T>のようなジェネリック型、またはClassA<ClassB<ClassC>>のような狂ったケースでは失敗すると思います。

汎用パラメータが組み込まれた型名を取得/解決する標準的な方法はありますか?そうでない場合、私は手動でこれをどのように行うことができますか?

+0

'.GetType'は、型を表す' Type'、つまり型の型を取得しませんか? – dcg

+0

ですが、シリアル化して後で逆シリアル化する必要があります –

+0

[MSDN](https://msdn.microsoft.com/en-us/library/w3f99sx1(v = vs.110).aspx)forそのオーバーロードはtypeNameが** "取得する型のアセンブリ修飾名"であることを示しています。**したがって、原則として問題はありません。ところで、私はそのオーバーロードを知らなかった、あなたは毎日何か新しいことを学ぶと思う:) – dcg

答えて

1

の代わりに、それは非常に時間がかかることはありません、この場合には、テストする方が良いでしょう信じて:

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 

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 

ジェネリック型の型の名前は、すでに必要なすべての情報が含まれていますので、それIDictionaryを実装するタイプをJSON.NETが処理する方法のため、メッセージが辞書(失敗または間違ってデシリアライズされる)の場合は、アプローチは機能しません。

+0

ああ、シュート、私はMSDNのページを読んでから私の信念に基づいて、https://msdn.microsoft.com/en-us/library /system.type.assemblyqualifiedname(v=vs.110).aspx。しかし、私はそれを間違って読んだ。 –

関連する問題