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);
}

我敢打赌,您可以使用与 Method 相同的理念来做一些事情,以避免所有这些反射的东西。

Obs:仅当 T1 和 T2 是类型变量时才有效。如果他们是,as object您将获得一个Func<object, object>. 但是....如果您将赋予该方法的对象as object也是如此,那根本没有问题。也许你甚至可以Func<object, object>一直使用,这取决于你的场景。

于 2013-05-10T15:58:27.557 回答