2014-11-24 70 views
1

要儘量長話短說一個枚舉的描述,我創建了以下枚舉搜索包含斜線

public enum Frequency 
{ 
    [Description("Monthly")] 
    Monthly, 
    [Description("Quarterly")] 
    Quarterly, 
    [Description("N/A")] 
    NA 
} 

那我也使用相同的描述字符串組合框。

當我選擇一個新的選擇,特別是「N/A」,它不能正確讀取它。

,我使用搜索根據傳遞的字符串是正確的枚舉代碼...

/// Returns an enum of the specified type that matches the string value passed in. Note this does ignore case 
<param name="value">The string value.</param>   
public static TEnum GetEnum<TEnum>(string value) 
{ 
    if (string.IsNullOrEmpty(value)) 
    { 
     // Default not set value name 
     value = "None"; 
    } 
    return (TEnum)System.Enum.Parse(typeof(TEnum), value.Replace(" ", string.Empty), true); 
} 

所以,當值=「N/A」,我得到以下錯誤。 。

"An unhandled exception of type 'System.ArgumentException' occurred in mscorlib.dll" 

附加信息:請求的值「N/A」未找到「

我似乎無法理解爲什麼這可能發生還有另外一個,預先存在的組合框在那裏。解鎖還包含一個'/'字符,併發生相同的錯誤。所以它不是我做錯了,看起來,但只是枚舉字符串檢查的行爲。

任何洞察到爲什麼這會導致問題將不可思議的讚賞。 :) 謝謝!

編輯: 更多信息..

因此,這是觸發枚舉搜索代碼..

if (this.FrequencyCombo.SelectedItem != null && !this.FrequencyCombo.SelectedItem.Equals(Utilities.GetDescription(currentLoan.Frequency))) 
     { 
      currentLoan.Frequency = Utilities.GetEnum<Frequency>(this.FrequencyCombo.SelectedItem.ToString()); 
     } 
+2

它正在檢查名稱(NA),而不是描述(N/A)。 – juharr 2014-11-24 15:33:59

+0

顯示的代碼中沒有任何內容表示完全使用描述。 – Plutonix 2014-11-24 15:35:21

+0

爲什麼你沒有文字使用'Description',但是你的組合的值是枚舉值。 – Jamiec 2014-11-24 15:43:25

回答

1

替換爲以下你的方法,你想匹配的值說明:

/// <summary> 
    /// Gets the Enum from a matching description value 
    /// </summary> 
    /// <typeparam name="T"></typeparam> 
    /// <param name="description"></param> 
    /// <returns></returns> 
    public static T GetValueFromDescription<T>(string description) 
    { 
     var type = typeof(T); 
     if (!type.IsEnum) throw new InvalidOperationException(); 
     foreach (var field in type.GetFields()) 
     { 
      var attribute = Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute)) as DescriptionAttribute; 
      if (attribute != null) 
      { 
       if (attribute.Description == description) 
       { 
        return (T)field.GetValue(null); 
       } 
      } 
      else 
      { 
       if (field.Name == description) 
       { 
        return (T)field.GetValue(null); 
       } 
      } 
     } 

     throw new ArgumentException("Enum description not found.", "Description");    
    } 
0

Enum.Parse接受表示枚舉值的名稱字符串參數,而不是描述,即什麼Enum.ToString()返回。你需要一種方法,通過描述找到一個枚舉值,如下所示:

public static TEnum GetEnumByDescription<TEnum>(string desc) where TEnum : struct 
{ 
    if(string.IsNullOrEmpty(desc)) 
    { 
     return default(TEnum); 
    } 
    foreach(var field in typeof(TEnum).GetFields(BindingFlags.Static | BindingFlags.Public)) 
    { 
     var attr = (DescriptionAttribute)field.GetCustomAttribute(typeof(DescriptionAttribute)); 
     if(attr != null && attr.Description == desc) 
     { 
      return (TEnum)field.GetValue(null); 
     } 
    } 
    return default(TEnum); 
} 
0

這樣的事情可以做到。它列出所有成員,獲取他們的描述並將它們與您要查找的字符串進行比較。

public static T GetByDescription<T>(string description) { 
     return Enum.GetValues(typeof(T)) 
      .OfType<T>() 
      .First(f => { 
       var memberInfo = typeof(T).GetMember(f.ToString()); 
       var desc = memberInfo[0].GetCustomAttributes(typeof(DescriptionAttribute), false); 
       return desc.Length == 1 && ((DescriptionAttribute)desc[0]).Description.Equals(description, StringComparison.InvariantCultureIgnoreCase); 
      }); 
    } 

如何使用它:

GetByDescription<Frequency>("Monthly"); 
GetByDescription<Frequency>("N/A"); 

相關:Getting attributes of Enum's value