2012-02-07 7 views
3

私は実際にオブジェクトを拡張するdeepToStringメソッドをプログラミングしています。これは、リフレクションを使用してオブジェクトの各プロパティを取得し、このプロパティのdeepToStringメソッドを呼び出します。列挙型を除いてすべてうまく動作します。私がPropertyInfo.GetValue()を列挙型で使用しようとすると、常に0が返されます。C#で不明な列挙型から値を取得するにはどうすればよいですか?

実際のint値を取得するにはどうすればよいですか?私は何が欠けていますか?

+3

あなたは私たちに動作しないコード、およびそれを得るために失敗したその値が列挙型を持つクラスの短いサンプルを示すことができていますか?あなたが記述する方法はちょうどうまくいくはずです。あなたのクラスについて何か特別なものか、あるいはあなたがenumにアクセスする方法について何か特別なものがなければなりません。 – dasblinkenlight

+0

愚かな私!あなたが正しい。値は設定されていません。なぜそれが「0」になったのかという理由がありました。 'PropertyInfo.GetValue(オブジェクト、null)'は素晴らしい作品:) – germanSharper

答えて

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 
    } 
    } 
} 

私は、反射が悪であると付け加えなければなりません。レアそれが本当に必要とされる機会が..

+0

お返事ありがとうございます。しかし、私は、すべての可能な値ではなく、未知の列挙型のインスタンスの値を取得したかったのです。 私はテスト用にこれを使用しています。なぜなら、私が書いた各データオブジェクトに対してtoStringメソッドを書くのは怠惰だからです。私はリリースコードで決して使用しません:) – germanSharper

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 
    } 
} 
関連する問題