2013-11-27 4 views
2

У меня есть перечислениеКак конвертировать Enum, который является общим параметром для другого Enum?

enum BasicEnum 
{ 
    BasicValue1, 
    BasicValue2 
    //... 
} 

То, что я хотел бы иметь что-то похожее на

public void Foo<TEnum>(TEnum someEnum) 
    where TEnum : struct, IComparable, IFormattable, IConvertible 
{ 
    switch (someEnum) 
    { 
     case BasicEnum.BasicValue1: 
      //... 
      break; 
     case BasicEnum.BasicValue2: 
      //... 
      break; 
    } 
} 

TEnum Все типы содержат только значения, которые имеются в BasicEnum.

Конечно такой код не компилируется, поэтому я попытался изменить его на это:

public void Foo<TEnum>(TEnum someEnum) 
    where TEnum : struct, IComparable, IFormattable, IConvertible 
{ 
    BasicEnum basicEnum = (BasicEnum)someEnum; 

    switch (basicEnum) 
    { 
     //... 
    } 
} 

Как и ожидалось, здесь у меня есть ошибки снова «Невозможно преобразовать тип„TEnum“в„BasicEnum“»

это не так трудно найти трюк, как

var value = Convert.ToInt32(someEnum); 
var basicValue = (BasicEnum)value; 

Но это решение не кажется мне по душе так много. Есть ли способ лучше?

+1

нет, я не думаю, что есть лучший способ. Нельзя избежать броска. В лучшем случае вы можете использовать «TryParse». 'Enum.TryParse (someEnum.ToString(), out basicValue);' – NoviceProgrammer

+0

Кажется лучше, чем 'Convert.ToInt' – Shymep

ответ

2

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

(BasicEnum)Enum.ToObject(typeof(BasicEnum), someEnum) 
0

Это не самый красивый один, но вы можете использовать (с соответствующими проверками литыми добавленными):

BasicEnum basicEnum = (BasicEnum)(object)someEnum; 
0

Я бы с var success = BasicEnum.TryParse(someEnum.ToString(), out basicEnum), если я понял то, что вы необходимость.

+0

try parse - это статический метод класса Enum. Он не может быть доступен для BasicEnum – NoviceProgrammer

1

с учетом следующих перечислений

public enum FirstEnum 
{ 
    FirstEnum1, 
    FirstEnum2, 
    FirstEnum3 
} 

public enum SecondEnum 
{ 
    SecondEnum1, 
    SecondEnum2, 
    SecondEnum3 
} 

Вы можете бросить второе перечисление в первое перечисление, выполнив следующие действия.

SecondEnum secEnum = SecondEnum.SecondEnum2; 

FirstEnum firstEnum = (FirstEnum)Enum.ToObject(typeof(FirstEnum), secEnum); 

firstEnum теперь будет равна FirstEnum2

Вы также можете создать общий метод для преобразования ваших перечислений к вашему BasicType (т.е. FirstEnum)

public FirstEnum ConvertToFirstEnum(object enumToConvert) 
{ 
    FirstEnum value = (FirstEnum)Enum.ToObject(typeof(FirstEnum), enumToConvert); 
    return value; 
} 

И Вызов функции, как следует:

FirstEnum firstEnum = ConvertToFirstEnum(SecondEnum.SecondEnum3); 

Значение firstEnum будет равно FirstEnum3

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