2012-03-07 2 views
5

Если у меня есть перечисление из ЧараСинтаксической строка соответствует перечислимому значению

public enum Action 
{ 
    None, 
    Address = 'A', 
    Amendment = 'C', 
    Normal = 'N' 
} 

Что является лучшим способом для разбора одной строки символов, чтобы соответствовать соответствующему перечислимую полукоксу и не соответствовать Нет, если не найдено. TryParse соответствует имени, а не значению.

Например, если строка у меня была были «C» Я хотел бы получить Action.Amendement

Заранее спасибо

+2

«У меня есть перечисление символа» - нет, вы этого не сделали :) У вас есть перечисление 'int', значения которого указаны с использованием символьных литералов. – porges

+0

@Porges благодарит за разъяснения! – m4rc

ответ

5
char c = 'C'; // existent value 
var action = Enum.GetValues(typeof(Action)).Cast<Action>().FirstOrDefault(a => (char)a == c); 
// action = Action.Amendment 

и:

char c = 'X'; // non existent value 
var action = Enum.GetValues(typeof(Action)).Cast<Action>().FirstOrDefault(a => (char)a == c); 
// action = Action.None 
+0

Блестяще! Это работает так, как я хотел. :-) Спасибо – m4rc

4

Просто брось:

Action f = (Action)'C'; 

Если у вас есть строка и были положительными, это было не менее 1 символа, вы можете сделать:

Action f = (Action)"C"[0]; 
+0

Я думаю, что он хочет получить «Action.None» с «X», например, потому что «X» не является допустимым значением для перечисления. –

+0

@DarinDimitrov Да, я это заметил. Вот почему я поднял ваш ответ –

+0

Это чище вам, и «нам не нужен LINQ» для разбора перечисления, мы анализируем перечисления с 2003 года! »Omg, ffs. – b0rg

0

Перечисления числовые типы негласно. Вы можете попробовать класс открытых струн:

public class Action() 
{ 
    public const string A = "Address"; 
    public const string C = "Amendment"; 
} 

Если вы хотите сделать это 2 способами, то вы, вероятно, хотите использовать 2 способ словарь КОЛЛЕКЦИЯ.

3

Я лично оставил их как целые числа и использовал DescriptionAttributes и класс утилиты, чтобы получить описание описания для типа. Тогда вы можете использовать больше, чем просто персонаж, чтобы отображать то, что вы хотели.

Примером этого является;

/// <summary> 
    /// Returns the string value defined by the description attribute of the given enum. 
    /// If no description attribute is available, then it returns the string representation of the enum. 
    /// </summary> 
    /// <param name="value">Enum to use</param> 
    /// <returns>String representation of enum using Description attribute where possible</returns> 
    public static string StringValueOf(Enum value) 
    { 
     FieldInfo fi = value.GetType().GetField(value.ToString()); 
     DescriptionAttribute[] attributes = (DescriptionAttribute[])fi.GetCustomAttributes(typeof(DescriptionAttribute), false); 
     if (attributes.Length > 0) 
     { 
      return attributes[0].Description; 
     } 
     else 
     { 
      return value.ToString(); 
     } 
    } 

где ваше перечисление определено как нечто подобное;

+0

спасибо, я не знал об DescriptionAttributes.Это помогло мне (с другой проблемой, но все же ...) –

+0

@ DanielGruszczyk - нет проблем. Вы не ограничены также DescriptionAttributes. Любой [Cust omAttribute] (http://msdn.microsoft.com/en-us/library/84c42s56.aspx). Мы используем его для выполнения сопоставления значений одной системы другим (то есть значение Enum представляет значение для одной системы, и у нас есть несколько атрибутов описания для сопоставления с другими системами или более точное описание или какая-либо другая связанная информация, требующая связывания с значением перечисления). –

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