10

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

我想用 clr 类型做两件事:

  1. 找到实现 IHandles 的类和
  2. 在该类上调用 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?

4

3 回答 3

12

使用ToObject

var data = processedEvent.Data.ToObject(t);

或者如果你有一个已知的类型,那么:

MyObject data = processedEvent.Data.ToObject<MyObject>();
于 2014-07-30T08:47:34.600 回答
0

事实证明这很容易:

method.Invoke(allHandler, new[] { JsonConvert.DeserializeObject(processedEvent.Data.ToString(), t) });
于 2014-07-30T08:41:58.940 回答
0

如果由于某种原因您被困在较旧的 Newtonsoft Json.NET 包(大约 2012 年4.5.11 之前)并且无法访问已经提到 JToken.ToObject(Type)的内容,您可以在内部重用它的功能

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

于 2015-02-25T14:44:26.913 回答