2012-01-23 69 views
3

Possible Duplicate:
Cast string to enum with enum attribute如何將字符串設置爲枚舉變量?

我有一個enum這樣的:

public enum IddFilterCompareToCurrent 
{ 
    [StringValue("Ignore")] 
    Ignore, 
    [StringValue("Pre-Post")] 
    PrePost, 
    [StringValue("Custom")] 
    Custom 
} 

我也有一些DomainUpDown控件都充滿了枚舉我定義的值相同,exept因爲枚舉不接受-的性格,我必須使用Attributes將它們與DomainUpDown內容相匹配。

現在我的問題是如何將一個domainupdown的選定項插入到該枚舉類型的變量中?

類似:

private IddFilterCompareToCurrent myEnum = Enum.Parse(typeof(IddFilterCompareToCurrent), domainUpDown1.SelectedItem.ToString()); 

我得到這個錯誤:

Cannot implicitly convert type 'object' to 'Filtering.IddFilterCompareToCurrent'. An explicit conversion exists (are you missing a cast?)

+0

@Guillaume, – Mikant

+0

號@Mikant:的確是。你爲什麼認爲它不是? –

+0

對不起,您是對的。只是看錯了選項卡。 – Mikant

回答

3

這樣做:

private IddFilterCompareToCurrent myEnum = 
(IddFilterCompareToCurrent)Enum.Parse(typeof(IddFilterCompareToCurrent),domainUpDown1.SelectedItem.ToString()); 

Enum.Parse返回Object,所以你需要將其強制轉換。

+1

這沒有太大的幫助。一旦屬性值與枚舉值名稱不匹配,它現在將在運行時導致異常。 –

+0

@DanielHilgarth:修復它。複製/粘貼錯誤。 thx – Tigran

+0

我沒有看到你改變了什麼,但是這個改變沒有解決問題。請看看在重複評論中鏈接到的問題中接受的答案。 –

0

你可以改變枚舉並做這樣的事情,如果你這樣做,它將返回枚舉的名字。否則,[StringValue(「..」)的Actualy類是什麼樣的。 。?

enum IddFilterCompareToCurrent 
    { 

     Ignore,  
     PrePost, 
     Custom 
    } 

usage: 
    var strEnumNames = Enum.GetNames(typeof(IddFilterCompareToCurrent)); 

返回一個字符串[]「Ignore」,「PrePost」,「Custom」;

if you have this already working please ignore.. 
1

您需要創建枚舉的包裝對象,將讀取StringValueAttribute

public class EnumWrapper<TEnum> 
{ 
    public static EnumWrapper<TEnum>[] GetItems() 
    { 
     Type type = typeof(TEnum); 
     var enumObjects = Enum.GetValues(type); 
     var enumTyped = enumObjects.Select((v) => (TEnum)v); 
     EnumWrapper<TEnum>[] ret = enumTyped.Select((e) => new EnumWrapper<TEnum>(e)); 

     return ret; 
    } 
} 

public string DisplayName { get; private set; } 
public TEnum EnumValue { get; private set; } 

private EnumWrapper(TEnum enumVal) 
{ 
    Type type = enumVal.GetType(); 
    // Read attributes here. I'm leaving this out. if you need it, let me know. 
    DisplayName = GetStringValueAttributeOfEnumValue(enumVal); 
    EnumValue = enumVal; 
} 
1

你需要解析標註有等於該屬性的枚舉的字段名的值輸入值:

FieldInfo[] fields = typeof(IddFilterCompareToCurrent).GetFields(); 
       foreach (FieldInfo fi in fields) 
       { 
        object[] atts = fi.GetCustomAttributes(typeof(StringValueAttribute), false); 
        if (atts != null && atts.Length > 0) 
        { 
         StringValueAttributeatt = atts[0] as StringValueAttribute; 
         if (att.Value == domainUpDown1.SelectedItem.ToString()) return (IddFilterCompareToCurrent)Enum.Parse(typeof(IddFilterCompareToCurrent), fi.Name); 
        } 
       }