Я использую шаблон 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, но я не верю, что это работает ... (каждое лямбда-выражение является статическим?)