我正在使用 SignalR 来接收类型名称和 Json,目前我已经通过在服务器上使用管道符号连接来相对天真地实现:
var ctx = GlobalHost.ConnectionManager.GetConnectionContext<MyConnection>();
ctx.Connection.Broadcast(message.GetType().FullName + "|" + JsonConvert.SerializeObject(message));
在客户端上,我正在尝试反序列化回正确的类型,但当然不能在JsonConvert
上使用任何泛型方法,所以我想出了这个:
var pipePos = eventMessageString.IndexOf("|", StringComparison.Ordinal);
var typeName = eventMessageString.Substring(0, pipePos);
var eventJson = eventMessageString.Substring(pipePos + 1);
var eventType = Type.GetType(typeName);
var evt = JsonConvert.DeserializeObject(eventJson, eventType);
唯一的麻烦是evt
是一个Newtonsoft.Json.Linq.JObject
,而实际上它应该是eventType
类型的实例。
有没有更好的方法来做到这一点,或者至少有一个解决方案来让它工作?我觉得我错过了一些显而易见的东西——也许我已经盯着它太久了?
提前非常感谢。
eventType 是非空的吗?调用 Type.GetType 时,需要该类型的程序集限定名称。