我有一个使用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
}
}
我相信这些适用于普通类型,例如string
或MyCustomClass
。但是,我认为对于MyGenericClass<T>
之类的泛型类型或ClassA<ClassB<ClassC>>
之类的疯狂案例会失败。
是否有一种获取/解析内置通用参数的类型名称的标准方法?如果没有,我该如何手动完成?
答案 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
的类型的方式。