10

私は単純なイベント ディスパッチャーを作成しています。このイベントは、clr 型名を持つオブジェクトと、元のイベントを表す json オブジェクト (byte[] が処理されて jobject に処理された後) が発生します。誰かが詳細を知りたい場合は、GetEventStore を使用しています。

そのclrタイプを使用して2つのことをしたい:

  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 であることです。その上で t を定義していないため、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 Framework のバージョンとは関係ありません。

于 2015-02-25T14:44:26.913 に答える