2012-02-15 5 views
2

Я пытаюсь найти способ обработки перечислений в целом, но я не могу найти способ заставить его работать. Скажем, у меня есть несколько перечислений объявили что-то вроде этого:рассматривать Enum как общий?

public enum ABC { 
    One, 
    Two, 
    Three 
} 

public enum DEF { 
    Four, 
    Five, 
    Six 
} 

, и я хочу написать метод, который принимает Enum в качестве параметра и просто возвращает имя перечисления, как это:

public string GetEnumName(Enum anEnum) { 
    return anEnum.GetType().Name; 
} 

но если Я называю это GetEnumName(DEF); Я получаю «тип, который используется как ошибка переменной». Есть идеи? спасибо

EDIT Извините, что по ответам я, возможно, не был достаточно ясным. Я просто выбрал GetEnumName как очень упрощенный пример, чтобы проиллюстрировать проблему, а не как получить имя от типа. В основном я хочу метод, который я могу передать любое перечисление в и иметь его действия на этом перечислении непосредственно, благодаря

+2

Я думаю, вы хотите 'typeof (DEF)' – mydogisbox

+0

Вы ищите имя enum (например, GetEnumName (ABC) == "ABC") или имя одного из значений (например, GetEnumName (ABC.One) == «Один»)? –

+0

В более общем плане, можете ли вы привести примеры ожидаемого возвращаемого значения? – phoog

ответ

1

Возможно, это поможет?

public static class EnumExtensions 
{ 
    public static string GetEnumName<T>(this T value) where T : struct 
    { 
     var type = typeof(T); 
     if (!type.IsEnum) 
      throw new InvalidOperationException(string.Format("{0} is not an enum", type)); 
     return type.GetEnumName(value); 
    } 
} 
+0

Да, это было то, во что я ехал, вы и ромэн поняли, что мне нужно, спасибо – snappymcsnap

0

Просто пройти тип:

public string GetEnumName(Type enumType) 
{ 
    return enumType.Name; 
} 

И

GetEnumName(typeof(ABC)); 

На данный момент, если ваш метод ничего не делает, вы могли бы просто использовать typeof(ABC).Name вместо этого.

+0

Я думаю, что он хочет имя определенного значения некоторого типа перечисления (определенного в общем виде) в виде строки. –

3

Использование:

public static string GetTypeName<T>() 
{ 
    return typeof(T).Name; 
} 

Использование:

var result = GetTypeName<DEF>(); 
0

Вы не можете. Общие ограничения не допускаются для типов перечислений (включая System.Enum). Вместо этого используйте Enum.GetName.

1

Ваша проблема в том, что вы передаете тип вместо System.Type. Измените свой метод следующим образом:

public string GetEnumName(Type enumType) { 
    return enumType.Name; 
} 
1

То, что вы хотите написать что-то вроде этого:

public string GetEnumName<T>() where T : Enum 
{ 
    return typeof(T).Name; 
} 

То есть, общий метод с ограничением параметра типа.

К сожалению, не существует способа определить такое ограничение для перечислений в C# (и его невозможно определить для делегатов). Люди обычно идут на решение, упомянутое @ananthonline.

Фактически такое ограничение не поддерживается языком C#, но поддерживается на уровне CLR. Например, с помощью такого инструмента, как Mono.Cecil, вы можете изменить свою сборку и применить ограничение к методу после его компиляции.

Посмотрите на эту статью: Constraining generic constraints

Вы найдете инструмент, который облегчает процесс нанесения не-C# -Поддерживаемых ограничения параметров универсального типа: Cecil constraint patcher

И не забывайте, есть много полезных статических методов в классе Enum, если вы хотите работать с именами и значениями вашего перечисления. членов.

+0

да, это было то, во что я ехал, вы и ananthonline поняли, что мне нужно, спасибо – snappymcsnap

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