如何在.NET中保存对泛型类型的引用?

时间:2017-03-20 18:55:33

标签: c# .net generics

我有一个使用JSON保存消息的消息队列,以及一组按类型键入的消息接收器。我有这些方法来添加和删除队列中的项目:

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>>之类的疯狂案例会失败。

是否有一种获取/解析内置通用参数的类型名称的标准方法?如果没有,我该如何手动完成?

1 个答案:

答案 0 :(得分: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的类型的方式。