我正在使用 EventAgregator 模式来订阅和发布事件。如果用户使用 lambda 表达式订阅事件,他们必须使用强引用,而不是弱引用,否则表达式可能会在发布执行之前被垃圾回收。
我想在 DelegateReference 中添加一个简单的检查,以便如果程序员传入 lambda 表达式并使用弱引用,我会抛出一个参数异常。这是为了帮助“监管”代码。
例子:
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 但我不相信它有效......(每个 lambda 表达式都是静态的吗?)