Задать вопрос

Как написать метод, который будет выполняться перед каждым другим методом?

Есть метод A и методы B,С,D,E.
Нужно метод A выполнить перед каждым методом B,С,D,E, когда они будут запускаться и если метод A будет false, то выйти и не выполнять следующий код.
Фактически нужно вписать выполнение метода А в каждый из методов.
Но есть ли какой-то лучшей способ обёртки, что б не прописывать одинаковые действия в каждом из методов и наследовать класс А (с методом А) и пропускать всё через него?
  • Вопрос задан
  • 814 просмотров
Подписаться 2 Средний Комментировать
Пригласить эксперта
Ответы на вопрос 4
@kttotto
пофиг на чем писать
Создаете свой атрибут, где внутри будет отрабатывать Ваш метод А и декарируете методы B,С,D,E этим атрибутом. Каждый раз, перед тем как метод будет запускаться, сначала отработает тот, что в атрибуте.
Ответ написан
Exomode
@Exomode
Архитектор ПО
class Sample {
  protected bool A() {
    return true;  // Some logic value.
  }

  public void B() {
    if (!A()) return;

    // Some code...
  }
}

Это классический функциональный подход.
static class SampleExtensions {
  public static void ExecuteWithPrepare(this Action action, Func<bool> predicate) {
    if (predicate == null || !predicate()) return;

    action?.Invoke();
  }
}

А это один из примеров реализации простого делегирования. Через методы расширений. Можно через явные сигнатуры делегатов, можно и другие варианты придумать, зависит от задачи и фантазии.
Ответ написан
Комментировать
BasmanovDaniil
@BasmanovDaniil
Геймдизайнер-телепат
Это называется декоратор, в шарпе их нет. Не знаю, что у вас конкретно за случай, но иногда удобно бывает метод А вынести в статический класс. Либо можете сделать метод-посредник, в который вы будете передавать делегат, а он будет делать проверку и либо вызывать делегат, либо нет.
Ответ написан
yarosroman
@yarosroman Куратор тега C#
C# the best
Можно, но сложно, нужно использовать кодогенерацию, как пример
https://github.com/Fody/PropertyChanged

https://habrahabr.ru/post/95211/
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы