простые и совсем нехитрые тонкости
Задача: много много разных энамов, схема работы - похожая для всех, в проекте - сплошные switch'и
Как-то надо было побороть это безобразие, желательно просто и красиво - решено было воспользоваться generic методами
В итоге есть класс, который содержит в себе Dictionary<string, int> (ведь все enum'ы на самом деле int)
и есть метод, который возвращает значение определенного enum'a
Так вот, первая тонкость, с которой столкнулась - нельзя поставить ограничение Enum на тип generic метода
То есть, нельзя писать так (по крайней мере, в Net 2.0):
public T GetSortOrder<T>(T defaultValue) where T : Enum
Можно поставить ограничение на тип, выбрав один из интерфейсов, которые реализует Enum, например
public T GetSortOrder<T>(T defaultValue) where T : IConvertible
(это если необходимо внутри метода воспользоваться методами данного интерфейса)
Можно вообще не ставить ограничения на тип, НО обязательно стоит тогда первым же делом проверить внутри метода свойство
typeof(T).IsEnum и по необходимости выбросить исключение или же обработать как-то еще
Далее, не смотря на то, что явного ограничения на тип Enum нет, можно воспользоваться методами этого класса вот таким образом:
Enum.IsDefined(typeof(T), value) - проверяет, определено ли значение в энаме
(T)Enum.ToObject(typeof(T), intValue) - преобразует из целого типа в типа энама
и т.п.
Ну а поскольку мы же проверили и убедились в самом начале метода, что тип, с которым вызвали наш метод, точно энам, то это вполне безопасно