如何创建仅在运行时已知类型的委托?
我想做以下事情:
Type type1 = someObject.getType();
Type type2 = someOtherObject.getType();
var getter = (Func<type1, type2>)Delegate.CreateDelegate(
typeof(Func<,>).MakeGenericType(type1, type2), someMethodInfo);
我如何实现类似的目标?
答案 0 :(得分:6)
我怀疑您希望Expression.GetFuncType
作为执行typeof(...).MakeGenericType
操作的更简单方法。
var delegateType = Expression.GetFuncType(type1, type2);
Delegate getter = Delegate.CreateDelegate(delegateType, someMethodInfo);
你不能拥有getter
的编译时类型,而不是Delegate
但 1 ,因为你只是'在编译时知道该类型。您可以使用dynamic
,这样可以更容易地调用委托:
dynamic getter = ...;
var result = getter(input);
1 正如评论中所述,您可以转发给MulticastDelegate
,但它实际上并不会为您买任何东西。
答案 1 :(得分:2)
您可以为此创建一个通用方法:
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>
,具体取决于您的情况。