質問: LitJson.JsonMapper.ToObject<指定した型>(受信データ); ■LitJson内の定義 ``` public static T ToObject(string json); ``` ■環境 Visual Studio 2013 Community MonoなのでC#はおそらく3.0 .NetFrameWork2.0+3.5
回答: ジェネリックメソッドを動的に呼び出す場合のアプローチとしては * `Type`を引数にとる非ジェネリックな実装がないか探す。 * `MethodInfo.MakeGenericMethod`を使用する。 の2つが考えられます。問題のライブラリで非ジェネリックな実装は公開されていないようなので、直球の方法としては以下のような流れになります。 ``` // オーバーロードがあるためGetMethodsを使用して全メソッドを取得 var methods = typeof(JsonMapper).GetMethods(BindingFlags.Static | BindingFlags.Public); // 対象ジェネリックメソッド定義の抽出 var genMethod = methods.First(m => m.Name == "ToObject" && m.IsGenericMethodDefinition && m.GetParameters()[0].ParameterType == typeof(string)); // ジェネリックメソッド定義に型引数を渡して構築する // TODO:実際の型を指定する var constructed = genMethod.MakeGenericMethod(typeof(Hoge)); // メソッドを実行する // 第一引数:実行対象のインスタンス...staticメソッドのためnull // 第二引数:メソッドに渡す引数の配列(object[]) constructed.Invoke(null, new[] { json }); ``` という流れになるかと思います。 またソースを確認すると`JsonMapper.ToString(string)`の実装は ``` JsonReader reader = new JsonReader (json); return (T) ReadValue (typeof (T), reader); ``` となっています。この`ReadValue(Type, JsonReader)`メソッドはオーバーロードが簡単に解決できるので直接呼び出せば、コードが多少スッキリします。 ``` var method = typeof(JsonMapper).GetMethod( "ReadValue", BindingFlags.Static | BindingFlags.NonPublic, null, new [] { typeof(Type), typeof(JsonReader) }, null); method.Invoke(null, new object[] {typeof(Hoge), new JsonReader(json)}); ``` さらに言えば、該当ライブラリはパブリックドメインのようですのでソースを改変して上記の`ReadValue`メソッドを呼び出せるようにするのが一番簡単な方法だと思います。