2009-08-19 3 views
0

Я анализирую некоторые значения enum из текстового файла. Для того чтобы упростить вещи, я использую такие функции, как следующее:TryParsing Enums

(пример кода здесь используется C++/CLI, но ответы на C# также приветствуется.)

bool TryParseFontStyle(String ^string, FontStyle% style){ 
    try { 
     FontStyle ^refStyle = dynamic_cast<FontStyle^>(
      Enum::Parse(FontStyle::typeid, string)); 
     if(refStyle == nullptr) 
      return false; 
      style = *refStyle; 
     return true; 
    } 
    catch(Exception ^e){ 
     return false; 
    } 
} 

Теперь мне нужно переписать аналогичный функции для каждого типа перечисления, которые я обрабатываю. Как использовать generics для записи одной единственной функции для обработки любого типа перечисления?

Update: Нашли аналогичный вопрос здесь: How to TryParse for Enum value?

ответ

1
public static bool TryParseEnum<T> (string value, out T result) where T : struct 
{ 
    if (value == null) 
    { 
     result = default (T) ; 
     return false ; 
    } 

    try 
    { 
     result = (T) Enum.Parse (typeof (T), value) ; 
     return true ; 
    } 
    catch (ArgumentException) 
    { 
     result = default (T) ; 
     return false ; 
    } 
} 
+0

Спасибо. Это то, что я искал. Можно ли каким-либо образом ограничить T производной Enum? –

+0

Нет, нет. –

0

Этот метод, кажется, работает и не использует попробовать/поймать.

public static bool EnumTryParse<T>(string strType,out T result) 
{ 
    string strTypeFixed = strType.Replace(' ', '_'); 
    if (Enum.IsDefined(typeof(T), strTypeFixed)) 
    { 
     result = (T)Enum.Parse(typeof(T), strTypeFixed, true); 
     return true; 
    } 
    else 
    { 
     foreach (string value in Enum.GetNames(typeof(T))) 
     { 
      if (value.Equals(strTypeFixed, StringComparison.OrdinalIgnoreCase)) 
      { 
       result = (T)Enum.Parse(typeof(T), value); 
       return true; 
      } 
     } 
     result = default(T); 
     return false; 
    } 
} 

Source

0

В C#:

Enum.Parse(typeof(yourEnum),"yourValue"); 

Просто окружает, что с попыткой поймать и ваш набор пойти

+1

Фактически Enum.Parse (typeof (yourEnum), "yourValue"); –

+0

Это правильно, спасибо;) – Sergio