Func を次のように定義したとします。
Func<MyClass, object> f = o => o.StringProperty;
また
Func<MyClass, object> f = o => o.Property.SomeMethod();
具体的に呼び出さずに実際の戻り値の型を取得する方法はありますか?
Func を次のように定義したとします。
Func<MyClass, object> f = o => o.StringProperty;
また
Func<MyClass, object> f = o => o.Property.SomeMethod();
具体的に呼び出さずに実際の戻り値の型を取得する方法はありますか?
次のように戻り値の型を取得できます。
f.Method.ReturnType
しかし、これは type を返しますobject
。Method
またはString
または から派生したものを取得したい場合object
は、メソッドを呼び出さない限り情報を取得できません。
実際には可能ですが、これは、メソッド コアを逆アセンブルしてから分析し、メソッドが何を返すことができるかを確認する必要があることを意味します。しかし、それでも、さまざまな戻り値の型が存在する可能性があります。
したがって、答えは次のとおりです。オブジェクトが返されることを知りたい場合は、そうすることができます。
ジェネリック メソッドを使用して、コンパイラに型引数を推論させることで、これに近いことを行うことができます。
static Func<T1, R> Infer<T1, R>(Func<T1, R> f) { return f; }
その後:
var func = Infer((string s) => s.Length);
func
これにより、コンパイル時に戻り値の型が の型にエンコードされます。
もちろん、より一般的に適用可能なソリューションでは、1、2、3などの引数を使用してInfer
、カバーするための一連のオーバーロードが必要になります。Action
Func
その後、実行時に戻り値の型を取得したい場合は、ppetrov がすでに指摘しているように、どのような種類でFunc
も簡単です。func.Method.ReturnType