2013-06-21 4 views
0

У меня есть это перечисление:Как преобразовать char в объект Enum, основанный на char?

enum OptionalityEnum { call = 'C', put = 'P', undefined = 'N' } 

есть простой способ превратить символ в перечислимом тип? Это работает:

char chOpt = 'C'; 
OptionalityEnum opt = (OptionalityEnum)chOpt; //opt = OptionalityEnum.call 

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

char chOpt = 'X'; 
OptionalityEnum opt = (OptionalityEnum)chOpt; //opt = 88 

Я знаю некоторые функции Enum, но я не могу найти тот, который делает это преобразование для меня.

Enum.GetNames(typeof(OptionalityEnum)) = { call, na, put } 
Enum.GetValues(typeof(OptionalityEnum)) = { call, na, put } 
Enum.TryParse<OptionalityEnum>("C", out optionality) = false 

Enum.TryParse<OptionalityEnum>("call", out optionality) = true 
    //... but that's not what I want. 

Enum.IsDefined(typeof(OptionalityEnum), "call") = true 
    //... but that's not what I want. 

Должен ли я написать собственный конвертер? Что-то вроде этого?

частного статический OptionalityEnum Convert (голец ч) { результата OptionalityEnum = (OptionalityEnum) ч; if (Enum.IsDefined (typeof (OptionalityEnum), результат)) результат возврата; else return OptionalityEnum.undefined; }

private static bool TryConvert(char ch, out OptionalityEnum opt) 
{ 
    opt = (OptionalityEnum)ch; 
    return Enum.IsDefined(typeof(OptionalityEnum), opt); 
} 

Это работает, но это, кажется, неаккуратно. Я был бы удивлен, если что-то вроде этого еще не существует.

EDIT: Первоначально я использовал плохой пример для своей функции . Я изменил его на функцию TryConvert.

ответ

2

Ваше «неряшливое» решение кажется мне абсолютно подходящим. Нет ничего другого, что по умолчанию будет «неопределенным» для вас. Использование условного оператора будет сделать его немного чище:

private static OptionalityEnum Convert(char ch) 
{ 
    OptionalityEnum result = (OptionalityEnum)ch; 
    return Enum.IsDefined(typeof(OptionalityEnum), result) 
     ? result : OptionalityEnum.undefined; 
} 

EDIT: Для метода TryConvert, я на самом деле убедитесь, что вы установили opt в default(OptionalityEnum), если он не существует.

Но нет, я не считаю, что это существует в рамках. Тем не менее, вы можете посмотреть мой проект Unconstrained Melody, где вы могли бы хотя бы использовать метод расширения IsNamedValue, который избежал бы бокса.

+0

Хорошо, теперь я вижу, что я использовал плохой пример для своей функции преобразования. См. Мою функцию TryConvert. Это на самом деле короче, так что, возможно, это не так уж плохо. Я все еще удивляюсь, если ничего подобного уже не существует. – user2023861

+0

@ user2023861: Смотрите мое редактирование. Я действительно не думаю, что есть что-то подобное. –