创建运行时已知类型的委托
本文关键字:类型 运行时 创建 | 更新日期: 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>
,这取决于你的场景。