要在运行时创建委托,技术方法包括Delegate.CreateDelegate、Expression 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);
}
}
上述代码的目的是创建一个新的委托,该委托与原始委托相同,但为this参数创建了一个新的第一个参数...即之前封闭委托的开放版本。
是否有一种简单的方法可以克隆和修改现有的委托类型,或者最接近的解决方案是构建通用的Func<>和Action<>类型?