2015-07-28 4 views
0

Я довольно новичок в C#, и я пытаюсь создать универсальный метод расширения, который принимает любое перечисление в качестве параметра. На основании перечисления я хочу получить атрибут, который был применен в перечислении. Я хочу иметь возможность использовать этот метод расширения для нескольких перечислений. Я в настоящее время только статический метод непосредственно в моем классе, который содержит перечисление и это выглядит следующим образом:Создать общий метод расширения с перечислениями

public static string GetIDForEnum(Enum enum) 
{ 
    var item = typeof(Enum).GetMember(enum.ToString()); 
    var attr = item[0].GetCustomAttribute(typeof(DescriptionAttribute), false); 
    if(attr.Length > 0) 
     return ((DescriptionAttribute)attr[0]).Description; 
    else 
     return enum.ToString(); 
} 

Как сделать это универсальный метод расширения?

ответ

2

Как сделать это универсальным методом расширения?

В настоящий момент вы не можете ... потому что C# не позволяет сдерживать параметр типа для вывода из System.Enum. То, что вы хотите является:

public static string GetIdForEnum<T>(T value) where T : Enum, struct 

... но это ограничение является недействительным в C#.

Тем не менее, это не недействителен в ИЛ ... вот почему я создал Unconstrained Melody. Это в основном смесь:

  • библиотека с полезными родовыми делегатов и перечислений методов
  • Инструмент для запуска ILDASM и ILASM преобразовать допустимые ограничения в те, что мы действительно хотим

Вы могли делайте что-то подобное себе, но, если честно, все это немного хаки. Для перечислений это позволяет сделать намного более эффективный код, хотя ...

Смежные вопросы