我正在编写一个简单的事件调度程序,其中我的事件作为具有clr类型名称的对象和表示原始事件的json对象(在将byte []处理到jobject之后)被触发。如果有人想知道具体细节,我会使用GetEventStore。
我想把那个clr类型做两件事:
我已经设法通过以下代码使第1部分正常工作:
var processedEvent = ProcessRawEvent(@event);
var t = Type.GetType(processedEvent.EventClrTypeName);
var type = typeof(IHandlesEvent<>).MakeGenericType(t);
var allHandlers = container.ResolveAll(type);
foreach (var allHandler in allHandlers)
{
var method = allHandler.GetType().GetMethod("Consume", new[] { t });
method.Invoke(allHandler, new[] { processedEvent.Data });
}
ATM的问题是processedEvent.Data是一个JObject - 我知道processedEvent.Data的类型,因为我没有在它上面定义。
如何在不对类型名称进行任何讨厌的切换的情况下将该JObject解析为类型t?
答案 0 :(得分:9)
使用ToObject
:
var data = processedEvent.Data.ToObject(t);
或者如果你有一个已知的类型:
MyObject data = processedEvent.Data.ToObject<MyObject>();
答案 1 :(得分:0)
事实证明这很简单:
method.Invoke(allHandler, new[] { JsonConvert.DeserializeObject(processedEvent.Data.ToString(), t) });
答案 2 :(得分:0)
如果由于某种原因你被困在较旧的Newtonsoft Json.NET软件包(大约2012年pre 4.5.11)并且无法访问already mentioned JToken.ToObject(Type)
,那么你可以重复使用what it does internally:
var someJObject = ...; // wherever it came from; actually a JToken
var type = typeof(MyExpectedType);
MyExpectedType myObject;
using (var jsonReader = new JTokenReader(someJObject))
myObject = serializer.Deserialize(jsonReader, type);
我之所以提到这一点,只是因为我参与了一个项目,我不能将Json.NET的Nuget包更新到最新版本。此外,这与.NET框架版本无关。