我從這裏複製的代碼: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