繁体   English   中英

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

[英]How do I tell if an action is a lambda expression?

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM