如何判断动作是否为lambda表达式?

时间:2010-06-02 18:32:49

标签: c# .net lambda eventaggregator

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

1 个答案:

答案 0 :(得分:1)

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