对于实时创建委托,技术因Delegate.CreateDelegate,Expresion Lambda,DynamicMethod等而异。所有这些技术都要求您知道代表的类型。如何在运行时定义委托类型(即动态委托类型)
我想转换封闭的代表打开代表一般,并且要做到这一点,似乎我需要动态创建打开委托的类型,然后才能实际创建生成的委托。试想一下:
pubic class WeakEvent<TDelegate> where TDelegate : class
{
public WeakEvent(Delegate aDelegate)
{
var dgt = aDelegate as TDelegate;
if(dgt == null)
throw new ArgumentException("aDelegate");
MethodInfo method = dgt.Method;
var parameters = Enumerable
.Repeat(dgt.Target.GetType(),1)
.Concat(method.GetParameters().Select(p => p.ParameterType));
Type openDelegateType = // ??? original delegate, with new 1st arg for @this
var dm = new DynamicMethod("InnerCode", method.ReturnType, parameters);
... your favourite IL code emmisions go here
var openDelegate = dm.CreateDelegate(openDelegateType);
}
}
上述代码的purpsoe是创建一个新的委托它等同于原来的委托,但对这一个新的第一个参数...即一个开放的版本与之前关闭的代表。
有没有一种简单的方法来克隆&修改现有委托类型,或者是打造出来的通用函数功能<>和行动<>类型最接近的解决方案?