创建运行时已知类型的委托

本文关键字:类型 运行时 创建 | 更新日期: 2023-09-27 18:13:05

如何创建仅在运行时已知类型的委托?

我想做以下事情:

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

创建运行时已知类型的委托

我怀疑您希望Expression.GetFuncType作为typeof(...).MakeGenericType操作的更简单方法。

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

虽然1,但您不能为getter拥有比Delegate更具体的编译时类型,因为您在编译时根本不知道该类型。不过,您可能会使用dynamic,这将使调用委托更容易:

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

1如评论中所述,您可以强制转换为MulticastDelegate,但它实际上不会为您购买任何东西。

您可以为此创建一个泛型方法:

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>,这取决于你的场景。