我从这里复制的代码:https://whathecode.wordpress.com/2012/03/26/null-checks-for-event-handlers-an-aspect-solution/动态创建空的事件委托与泛型类型
但我似乎无法得到它的工作时,该事件是一个一般类型类中。我定义为类:
Public Class MultiKeyDictionary<TFirstKey, TSecondKey, TValue>
及以下事件:
public delegate void EventDelegate(TValue value);
public delegate void ReplacedEventDelegate(TValue oldValue, TValue newValue);
public event EventDelegate Added;
public event EventDelegate Removed;
public event ReplacedEventDelegate Replaced;
但初始化代码例外抱怨型的ContainsGenericParameters设置为true(或类似的东西)。
我已经改变了代码在RuntimeInitialize方法连结此:
public override void RuntimeInitialize(EventInfo eventInfo) {
base.RuntimeInitialize(eventInfo);
Type eventType;
MethodInfo delegateInfo = eventInfo.EventHandlerType.MethodInfoFromDelegateType();
ParameterExpression[] parameters = delegateInfo.GetParameters().Select(p => Expression.Parameter(p.ParameterType)).ToArray();
if(eventInfo.EventHandlerType.ContainsGenericParameters) {
var genericDelegate = eventInfo.EventHandlerType.GetGenericTypeDefinition();
var genericParams = genericDelegate.GetGenericArguments();
eventType = genericDelegate.MakeGenericType(genericParams);
} else {
eventType = eventInfo.EventHandlerType;
}
Delegate emptyDelegate = Expression.Lambda(eventType, Expression.Empty(), "EmptyDelegate", true, parameters).Compile();
this.addEmptyEventHandler = instance => eventInfo.AddEventHandler(instance, emptyDelegate);
}
但所有我现在得到的是一个ArgumentException:类型的ParameterExpression“TValue”不能被用于类型的委托参数创建emptyDelegate的行上的'TValue'。
我正在讲这个问题。有趣的是,我在寻找帮助时结束了这篇文章。 :) – 2012-11-05 16:50:33