Как мне узнать, является ли действие лямбда-выражением? - PullRequest
2 голосов
/ 02 июня 2010

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

1 Ответ

1 голос
/ 02 июня 2010

Нет, не каждый лямбда-генерируемый делегат является статическим методом. Если есть захваченные переменные, это может быть экземпляр. Но в конечном счете, между лямбда-делегатом, делегатом на основе анонимного метода и явным делегатом очень мало различий. Я бы не стал делать никакой дополнительной логики - просто воспринимал бы это как делегат (я бы полностью удалил код WeakReference).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...