3

実行時にのみ認識されるタイプのデリゲートを作成するにはどうすればよいですか?

私は次のことをしたいと思います:

Type type1 = someObject.getType();
Type type2 = someOtherObject.getType();   

var getter = (Func<type1, type2>)Delegate.CreateDelegate(
    typeof(Func<,>).MakeGenericType(type1, type2), someMethodInfo);

どうすれば同様のことを達成できますか?

4

2 に答える 2

8

Expression.GetFuncType操作を行うためのより簡単な方法として望んでいると思いますtypeof(...).MakeGenericType

var delegateType = Expression.GetFuncType(type1, type2);
Delegate getter = Delegate.CreateDelegate(delegateType, someMethodInfo);

コンパイル時にその型がわからないため、 1よりも具体的なコンパイル時の型を持つことはできません。ただし、デリゲートを呼び出すのが簡単になる可能性があります。getterDelegatedynamic

dynamic getter = ...;
var result = getter(input);

1コメントで述べたように、 にキャストできMulticastDelegateますが、実際には何も得られません。

于 2013-05-10T14:09:13.163 に答える
3

そのための汎用メソッドを作成できます。

public Func<T1, T2> GetFunc<T1, T2>(T1 Object1, T2 Object2, MethodInfo Method)
{
    return (Func<T1, T2>)Delegate.CreateDelegate(typeof(Func<,>).MakeGenericType(typeof(T1), typeof(T2)), Method);
}

そして、メソッドと同じ哲学を使用して、このすべての反射を回避するために何かを行うことができるに違いありません.

Obs: T1 と T2 が型付き変数の場合にのみ機能します。もしそうなら、as objectあなたはFunc<object, object>. しかし....メソッドに渡すオブジェクトas objectも同様であれば、まったく問題ありません。Func<object, object>また、シナリオによっては、常に使用することもできます。

于 2013-05-10T15:58:27.557 に答える