2

我正在使用 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 表达式都是静态的吗?)

4

1 回答 1

1

不,不是每个 lambda 生成的委托都是静态方法。如果有捕获的变量,它可以是一个实例。但最终,基于 lambda 的委托、基于匿名方法的委托和显式委托之间几乎没有区别。我不会做任何额外的逻辑 - 只是把它当作一个委托(我会WeakReference完全删除代码)。

于 2010-06-02T18:44:54.883 回答