2012-02-07 86 views
3

我實際上編寫了一個擴展對象的deepToString方法。這使用反射來獲取對象的每個屬性,並調用此屬性的deepToString-Method。一切工作正常,除了枚舉。如果我嘗試使用枚舉PropertyInfo.GetValue(),它總是返回零。如何從C#中的未知枚舉中獲取值?

我怎樣才能得到真正的int值?我錯過了什麼?

+3

你能不能告訴我們,不工作的代碼,一類與枚舉類型,它未能得到價值很短的樣本?你所描述的方法應該是可行的,對於你的班級或訪問枚舉的方式必須有一些特殊的東西。 – dasblinkenlight 2012-02-07 11:09:12

+0

愚蠢的我!你是對的。價值尚未設置。這就是爲什麼它導致「0」的原因。 'PropertyInfo.GetValue(object,null)'效果很好:) – germanSharper 2012-02-07 12:34:48

回答

1
foreach (PropertyInfo propertyInfo in your_class.GetType().GetProperties()) 
{ 
    if ((info.PropertyType.IsEnum) && (info.PropertyType.IsPublic)) 
    { 
    foreach (FieldInfo fInfo in this.propertyInfo.PropertyType.GetFields(BindingFlags.Public | BindingFlags.Static)) 
    { 
     ListItem item = new ListItem(fInfo.Name, fInfo.GetRawConstantValue().ToString()); 
     //... use it 
    } 
    } 
} 

我必須補充說,反射是EVIL。罕見的是它真正需要的場合..

+0

感謝您的回答。但是我想要獲得未知枚舉實例的值,而不是所有可能的值。 我只是將這個用於testing-ui,因爲我懶得爲我寫的每個數據對象編寫toString-Method。我永遠不會在發佈代碼中使用它:) – germanSharper 2012-02-07 12:39:00

1
public enum Foo 
{ 
    Boo, 
    Koo 
} 

public Foo foo { get; set; } 

[Fact] 
public void FactMethodName() 
{ 
    foo = Foo.Koo; 
    var propertyInfo = this.GetType().GetProperty("foo"); 
    if (propertyInfo.PropertyType.IsEnum) 
    { 
     var value = propertyInfo.GetValue(this, null); 
     Console.Out.WriteLine("value = {0}", value); //prints Koo 
     int asInt = (int)value; 
     Console.Out.WriteLine("asInt = {0}", asInt); //prints 1 
    } 
}