我實際上編寫了一個擴展對象的deepToString方法。這使用反射來獲取對象的每個屬性,並調用此屬性的deepToString-Method。一切工作正常,除了枚舉。如果我嘗試使用枚舉PropertyInfo.GetValue()
,它總是返回零。如何從C#中的未知枚舉中獲取值?
我怎樣才能得到真正的int值?我錯過了什麼?
我實際上編寫了一個擴展對象的deepToString方法。這使用反射來獲取對象的每個屬性,並調用此屬性的deepToString-Method。一切工作正常,除了枚舉。如果我嘗試使用枚舉PropertyInfo.GetValue()
,它總是返回零。如何從C#中的未知枚舉中獲取值?
我怎樣才能得到真正的int值?我錯過了什麼?
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。罕見的是它真正需要的場合..
感謝您的回答。但是我想要獲得未知枚舉實例的值,而不是所有可能的值。 我只是將這個用於testing-ui,因爲我懶得爲我寫的每個數據對象編寫toString-Method。我永遠不會在發佈代碼中使用它:) – germanSharper 2012-02-07 12:39:00
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
}
}
你能不能告訴我們,不工作的代碼,一類與枚舉類型,它未能得到價值很短的樣本?你所描述的方法應該是可行的,對於你的班級或訪問枚舉的方式必須有一些特殊的東西。 – dasblinkenlight 2012-02-07 11:09:12
愚蠢的我!你是對的。價值尚未設置。這就是爲什麼它導致「0」的原因。 'PropertyInfo.GetValue(object,null)'效果很好:) – germanSharper 2012-02-07 12:34:48