C # Multi метод, прикрепленный к событию, как обрабатывать возвращаемое значение? - PullRequest
1 голос
/ 08 декабря 2009

Это вызов:

    bool isValid = true;
    if (this.ExternalConstraint != null)
    {
      isValid &= this.ExternalConstraint(this, EventArgs.Empty);
    }
    if (isValid)
    {
        //...
    }

Событие выглядит так:

public delegate bool externalConstraint(object sender, EventArgs args);
event externalConstraint ExternalConstraint;

При отладке я замечаю, что вызывается весь метод, прикрепленный к событию, но, похоже, только эта строка возвращает эту строку: isValid &= this.ExternalConstraint(this, EventArgs.Empty);. Как я могу получить событие для возврата каждого метода или обработки всего возвращаемого значения для принятия решения?

Ответы [ 4 ]

6 голосов
/ 08 декабря 2009

Вы можете использовать Delegate.GetInvocationList для делегата и обрабатывать возвращаемые значения индивидуально.

4 голосов
/ 08 декабря 2009

При использовании событий считается плохой практикой зависеть от возвращаемых значений. Скорее, вы должны использовать пользовательский EventArgs, чтобы получить результаты.

public class ConstraintEventArgs : EventArgs
{
    public bool IsValid { get; set; }
}

Также важно реализовать некоторый механизм, в котором несколько прослушивателей событий не будут переопределять значения друг друга. Большую часть времени (с логическим флагом) мы разрешаем (или поощряем) пользователям только явно включать его (никогда не выключать).

Например, с CancelEventArgs никогда не стоит явно указывать false; Пользователи всегда должны устанавливать его на true или ничего не делать. Та же самая идея должна применяться здесь с IsValid.

3 голосов
/ 08 декабря 2009

Создайте собственный класс EventArgs с методом добавления кода возврата. Затем каждый слушатель может вызвать метод, и после завершения события вы можете выполнить итерации кодов возврата. Это также позволяет добавлять данные о том, какой слушатель возвратил что и почему.

private class MyEventArgs : EventArgs {
   public void addReturnCode(bool retCode){
       //...
   }

   public IList<bool> getReturnCodes(){
       //...
   }

}
1 голос
/ 08 декабря 2009

Вы бы итерировали результат из ExternalConstraint. GetInvocationList вместо простого вызова делегата Constraint.

...