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

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

我想做以下事情:

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