使用运行时已知的类型创建委托
如何创建仅在运行时已知类型的委托?
我想做以下事情:
Type type1 = someObject.getType(); Type type2 = someOtherObject.getType(); var getter = (Func)Delegate.CreateDelegate( typeof(Func).MakeGenericType(type1, type2), someMethodInfo);
我怎样才能达到类似的效果?
我怀疑你想要Expression.GetFuncType
作为一种更简单的方式来做你的typeof(...).MakeGenericType
操作。
var delegateType = Expression.GetFuncType(type1, type2); Delegate getter = Delegate.CreateDelegate(delegateType, someMethodInfo);
你不能拥有比Delegate
更具体的getter
的编译时类型,因为你只是在编译时不知道该类型。 您可以使用dynamic
,这样可以更容易地调用委托:
dynamic getter = ...; var result = getter(input);
1如评论中所述,您可以转发到MulticastDelegate
,但它实际上不会为您购买任何东西。
您可以为此创建一个通用方法:
public Func GetFunc(T1 Object1, T2 Object2, MethodInfo Method) { return (Func)Delegate.CreateDelegate(typeof(Func<,>).MakeGenericType(typeof(T1), typeof(T2)), Method); }
而且我打赌你可以使用与方法相同的哲学来做一些事情,以避免所有这些反思的东西。
Obs:仅当T1和T2是类型变量时才有效。 如果它们是as object
你将得到一个Func
。 但是……如果你给方法的as object
也是as object
,那就没问题了。 也许你甚至可以使用Func
,具体取决于你的场景。