@romaro

Как упросить это if...else выражение?

У меня есть метод, который принимает обобщенный делегат. Внутри нужно определить тип полученного параметра, чтобы поместить его значение в приватное свойство подходящего типа:
public void SetStrategy<T>(Action<T> executor)
        {
            if (executor is Action<SomeOne> a)
            {
                _someOne = a;
            } else if (executor is Action<SomeTwo> b)
            {
                _someTwo = b;
            } 
// ...
        }


Можно ли упростить это вражение? Я пока вижу только вариант отказаться от обобщения и создать перегрузки для SetStrategy.
  • Вопрос задан
  • 87 просмотров
Решения вопроса 2
VoidVolker
@VoidVolker Куратор тега C#
Dark side eye. А у нас печеньки! А у вас?
Перегрузка - самый оптимальный вариант.
Ответ написан
Вообще тут напрашивается перегрузка для каждого T:
public void SetStrategy(Action<SomeOne> action) {
  _someOne = action;
}

public void SetStrategy(Action<SomeTwo> action) {
  _someTwo = action;
}

Но можно и так, если прям необходимо один метод (стоит задуматься, а действительно ли необходимо):
switch(executor) {
  case Action<SomeOne> one:
    _someOne = one;
    break;
  case Action<SomeTwo> two:
    _someTwo = b;
    break;
  default:
    throw new NotSupportedException($"{typeof(T).FullName} is not supprted");
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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