Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在运行时将JObject转换为类型_C#_Casting_Json.net_Eventstoredb - Fatal编程技术网

C# 在运行时将JObject转换为类型

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

我正在编写一个简单的事件调度器,其中我的事件以对象的形式出现,具有clr类型名称,json对象表示触发的原始事件(在字节[]被处理到jobject中之后)。如果有人想知道细节,我正在使用GetEventStore

我想使用该clr类型来完成两件事:

  • 查找实现IHandles和的类
  • 对该类调用Consume(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 });
         }
    
    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);