ここからコードをコピーしました: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だけです。emptyDelegateを作成する行で、タイプ'TValue'のParameterExpressionをタイプ'TValue'のデリゲートパラメーターに使用することはできません。