2014-11-24 96 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