Использование enum в качестве типичного параметра типа в С#
Возможный дубликат:
Ограничения типа Enum в С#
Можно ли использовать типы enum
в качестве общего параметра с помощью его класса-оболочки enum
?
У меня разные перечисления:
enum errors1 { E1, E3, E8 };
enum errors2 { E0, E2, E9 };
enum errors3 { E7, E4, E5 };
Со следующим объявлением класса я думал, что смогу его достичь:
public class MyErrors<T> where T : Enum
{
T enumeration;
public T getEnumeration()
{
return enumeration;
}
static void Main(string[] args)
{
Program<error1> p = new Program<error1>();
p.getEnumeration().E1 // this call does NOT work
}
Однако, поскольку общий тип enum
, я могу получить доступ только к члену и методам класса enum
. Так можно ли реализовать его так, как я хотел или какой другой подход использовать?
Ответы
Ответ 1
Нет, к сожалению, это невозможно. Лучшее, что вы можете сделать, это использовать where T : struct, IComparable, IConvertible, IFormattable
(что, конечно, не одно и то же). Ограничения интерфейса основаны на реализации System.Enum
.
Кроме того, вы можете проверить, есть ли typeof(T).IsEnum
, который может обнаружить проблему во время выполнения и предположительно выбросить исключение. Но во время компиляции нельзя использовать это ограничение.
Ответ 2
Это не выполнимо на уровне языка в С#, но оно поддерживается базой CLR. Вы можете использовать Jon Skeet Unconstrained Melody, который преобразует сгенерированный двоичный код в один с фактическим общим ограничением enum.