C# 在运行时将JObject转换为类型
我正在编写一个简单的事件调度器,其中我的事件以对象的形式出现,具有clr类型名称,json对象表示触发的原始事件(在字节[]被处理到jobject中之后)。如果有人想知道细节,我正在使用GetEventStore 我想使用该clr类型来完成两件事:C# 在运行时将JObject转换为类型,c#,casting,json.net,eventstoredb,C#,Casting,Json.net,Eventstoredb,我正在编写一个简单的事件调度器,其中我的事件以对象的形式出现,具有clr类型名称,json对象表示触发的原始事件(在字节[]被处理到jobject中之后)。如果有人想知道细节,我正在使用GetEventStore 我想使用该clr类型来完成两件事: 查找实现IHandles和的类 对该类调用Consume(clr类型) 我已成功地使用以下代码使第1部分正常工作: var processedEvent = ProcessRawEvent(@event); var t = Typ
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 });
}
var processedEvent=ProcessRawEvent(@event);
var t=Type.GetType(processedEvent.EventClrTypeName);
var type=typeof(IHandlesEvent)。MakeGenericType(t);
var allHandlers=container.ResolveAll(类型);
foreach(allHandlers中的var allHandler)
{
var method=allHandler.GetType().GetMethod(“消费”,新[]{t});
调用(allHandler,new[]{processedEvent.Data});
}
ATM问题是processedEvent.Data是一个作业对象-我知道processedEvent.Data的类型,因为我没有在上面定义它
如何在不切换类型名的情况下将JObject解析为类型t?这非常简单:
method.Invoke(allHandler, new[] { JsonConvert.DeserializeObject(processedEvent.Data.ToString(), t) });
使用
对象
:
var data = processedEvent.Data.ToObject(t);
或者,如果您有已知类型,则:
MyObject data = processedEvent.Data.ToObject<MyObject>();
MyObject data=processedEvent.data.ToObject();
如果由于某种原因,您被困在Newtonsoft Json.NET(大约2012年)的旧软件包上,无法访问,您可以重新使用:
我之所以提到这一点,只是因为我参与了一个项目,我无法将Json.NET的Nuget包更新为最新版本。此外,这与.NET framework版本无关。你试过了吗?是的-现在觉得有点愚蠢:)
。ToObject(Type…
仅在JSON.NET 4.5之后才可用,如果出于某种原因,你被困在一个较旧的包JObject
和ToObject
都出现在同一个JSON.NET
版本中(版本:7.0.0.0)是的,因为第7版是在第4.5版之后,这就是我的评论所指的——它是第4.5.11版,这是不正确的。首先,json.net与.net framework版本没有任何关系。你是否声称2012年11月11日之后添加的任何内容只会在4.5.11版上运行?其次,我打开了一个.net 3.5框架,并获得了json.net包我想你误解了我——我说的是4.5版的,而不是.NET框架。你的回答很好,我只是提到了一个(相当荒谬的)警告,以防其他人在与我相同的情况下(受限于旧的软件包)到达这里。
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);