使用运行时已知的类型创建代理
问题描述:
如何创建仅在运行时已知的类型的代理?使用运行时已知的类型创建代理
我想做到以下几点:
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);
你不能有一个编译时类型getter
这是更具体的比Delegate
虽然,因为你根本不知道该类型在编译时。你可能使用dynamic
,虽然,这将使它更容易调用委托:
dynamic getter = ...;
var result = getter(input);
正如在评论中指出,你可能投地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>
,这取决于你的场景。
你不能。 'Func'在编译时是不知道的。 –
leppie
2013-05-10 14:06:31
您的变量'getter'必须具有编译时已知的_compile-time_类型。这可能是'System.Delegate'。 – 2013-05-10 14:18:40