2011-09-20 233 views
3

因此,我們有我們的枚舉的設置是這樣的:字符串轉換爲枚舉的枚舉名

[CorrelatedNumeric(0)] 
[Description("USD")] 
[SequenceNumber(10)] 
USD = 247 

基本上,另一個功能可提供string「USD」給我,但沒有確切的枚舉,因爲源它是Excel,我們不能讓用戶記住枚舉值;)也不會有多大意義。

有沒有辦法在c#中從「美元」獲得247從我們的枚舉設置,因爲他們是上面?

回答

13

請問Enum.TryParse()Enum.Parse()做你所需要的?

Currency cValue = (Currency) Enum.Parse(typeof(Currency), currencyString); 
+1

@slandau:這是基於enum * name *而不是屬性值。那是你的追求?如果是這樣,最好改變你的文章的標題 - 我回答假設你想要它基於'Description'屬性。 –

+0

嗯,他們實際上總是命名相同,所以我會改變我的文章的標題,但感謝您的回答以及:) – slandau

4

絕對 - 反思建立一個Dictionary<string, YourEnumType>。只需迭代枚舉中的所有字段並查找屬性值,然後按照這種方式構建字典。

你可以看到我是如何做到在Unconstrained Melody的描述屬性類似的東西,在EnumInternals

// In the static initializer... 
ValueToDescriptionMap = new Dictionary<T, string>(); 
DescriptionToValueMap = new Dictionary<string, T>(); 
foreach (T value in Values) 
{ 
    string description = GetDescription(value); 
    ValueToDescriptionMap[value] = description; 
    if (description != null && !DescriptionToValueMap.ContainsKey(description)) 
    { 
     DescriptionToValueMap[description] = value; 
    } 
} 

private static string GetDescription(T value) 
{ 
    FieldInfo field = typeof(T).GetField(value.ToString()); 
    return field.GetCustomAttributes(typeof(DescriptionAttribute), false) 
       .Cast<DescriptionAttribute>() 
       .Select(x => x.Description) 
       .FirstOrDefault(); 
} 

只是做同樣的事情爲自己的屬性類型。

+1

+1,這使得更多的意義,因爲它「解析」根據描述屬性,而不是枚舉值的名稱,如''Enum.Parse()''做。 –

1
public static object enumValueOf(string description, Type enumType) 
{ 
     string[] names = Enum.GetNames(enumType); 
     foreach (string name in names) 
     { 
      if (descriptionValueOf((Enum)Enum.Parse(enumType, name)).Equals(description)) 
      { 
       return Enum.Parse(enumType, name); 
      } 
     } 

     throw new ArgumentException("The string is not a description of the specified enum."); 
    } 

    public static string descriptionValueOf(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(); 
     } 
    }