C# параметр зависит от значения перечисления - PullRequest
1 голос
/ 11 апреля 2020

Я ищу решение для такой функциональности. Это возможно? Может быть с дженериками? Я хотел бы иметь Add-функцию, где тип параметра зависит от значения перечисления. Я знаю, что есть некоторые другие решения, но я хотел бы увидеть / иметь это решение.

public enum eSomeEnum
{
   //only Int32
   Value1 = 1,
   //only string
   Value2 = 2,
   //only MyClass
   Value3 = 3,
}

private void Test()
{

   Int32 n1 = 61;
   string s2 = "Hello";
   MyClass c3 = new MyClass();


   //correct
   Add(eSomeEnum.Value1, n1);
   Add(eSomeEnum.Value2, s2);
   Add(eSomeEnum.Value3, c3);

   //wrong type
   Add(eSomeEnum.Value3, s2); --> Compiler Error
}

1 Ответ

0 голосов
/ 11 апреля 2020

Это не то, что может быть применено непосредственно на уровне подписи; чтобы Add(eSomeEnum.Value2, s2); было законным, подпись Add(eSomeEnum, string) должна быть действительной, что означает, что Add(eSomeEnum.Value3, s2); должен быть действительным.

Вы могли бы иметь возможность написать анализатор Rosyln, который обнаруживает это pattern и помечает его как предупреждение, но это довольно продвинутый topi c. Он также не сможет охватить весь сценарий ios, например, где используемое перечисление не является литералом, а является результатом выражения. Возможно, вам просто придется зависеть от проверки / исключений во время выполнения.

В качестве альтернативы рассмотрите возможность использования таких методов, как:

public void Add(int value) => Add(eSomeEnum.Value1, value);
public void Add(string value) => Add(eSomeEnum.Value2, value);
public void Add(MyClass value) => Add(eSomeEnum.Value3, value);
// (and your existing Add method, now 'private')

Теперь вызывающая сторона не может ошибиться, Это может быть расширено, если для каждого типа допустимо несколько перечислений:

public void AddFoo(string value) => Add(eSomeEnum.Value2, value);
public void AddBar(string value) => Add(eSomeEnum.Value3, value);
...