EventAgregator パターンを使用して、イベントをサブスクライブおよび公開しています。ユーザーがラムダ式を使用してイベントをサブスクライブする場合、弱参照ではなく強参照を使用する必要があります。そうしないと、パブリッシュが実行される前に式がガベージ コレクションされる可能性があります。
DelegateReference に簡単なチェックを追加して、プログラマーがラムダ式を渡し、弱い参照を使用している場合に引数の例外をスローするようにしたいと考えました。これは、コードを「監視」するのに役立ちます。
例:
eventAggregator.GetEvent<RuleScheduler.JobExecutedEvent>().Subscribe
(
e => resetEvent.Set(),
ThreadOption.PublisherThread,
false,
// filter event, only interested in the job that this object started
e => e.Value1.JobDetail.Name == jobName
);
public DelegateReference(Delegate @delegate, bool keepReferenceAlive)
{
if (@delegate == null)
throw new ArgumentNullException("delegate");
if (keepReferenceAlive)
{
this._delegate = @delegate;
}
else
{
//TODO: throw exception if target is a lambda expression
_weakReference = new WeakReference(@delegate.Target);
_method = @delegate.Method;
_delegateType = @delegate.GetType();
}
}
何か案は?@delegate.Method.IsStatic を確認できると思いましたが、うまくいくとは思いません... (すべてのラムダ式は静的ですか?)