使用运行时已知的类型创建代理

问题描述:

如何创建仅在运行时已知的类型的代理?使用运行时已知的类型创建代理

我想做到以下几点:

Type type1 = someObject.getType(); 
Type type2 = someOtherObject.getType(); 

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

我怎样才能实现类似的东西吗?

+1

你不能。 'Func '在编译时是不知道的。 – leppie 2013-05-10 14:06:31

+0

您的变量'getter'必须具有编译时已知的_compile-time_类型。这可能是'System.Delegate'。 – 2013-05-10 14:18:40

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

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

你不能有一个编译时类型getter这是更具体的比Delegate虽然,因为你根本不知道该类型在编译时。你可能使用dynamic,虽然,这将使它更容易调用委托:

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

正如在评论中指出,你可能投地MulticastDelegate,但它不会实际购买你任何事情。

+1

+1:从我没有阅读的问题也没有答案sicophantic upvote。尽我的责任! (开玩笑) – x0n 2013-05-10 14:11:51

+0

'MulticastDelegate'更具体; p – leppie 2013-05-10 14:17:51

+0

@leppie:True。将编辑。 – 2013-05-10 14:34:52

你可以创建一个通用的方法:

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