在运行时将JObject转换为type

时间:2014-07-30 06:55:17

标签: c# casting json.net get-event-store

我正在编写一个简单的事件调度程序,其中我的事件作为具有clr类型名称的对象和表示原始事件的json对象(在将byte []处理到jobject之后)被触发。如果有人想知道具体细节,我会使用GetEventStore。

我想把那个clr类型做两件事:

  1. 找到实现IHandles和
  2. 的类
  3. 在该类
  4. 上调用Consume(clr type)

    我已经设法通过以下代码使第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?

3 个答案:

答案 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框架版本无关。