2012-02-07 2 views
3

Я на самом деле программирую метод deepToString, который расширяет объект. Это использует отражение для получения каждого свойства объекта и вызывает метод deepToString-Method для этого свойства. Все работает отлично, за исключением Enums. Если я попытаюсь использовать PropertyInfo.GetValue() с перечислением, он всегда возвращает ноль.Как я могу получить значение из неизвестного enum в C#?

Как я могу получить реальную стоимость int? Что мне не хватает?

+3

Не могли бы вы показать нам код, который не работает, и короткий образец класса с перечислением, стоимость которого она не может получить? Метод, который вы описываете, должен работать, должно быть что-то особенное в вашем классе или о том, как вы обращаетесь к перечислению. – dasblinkenlight

+0

Глупо меня! Ты прав. Значение не установлено. Вот почему это привело к «0». 'PropertyInfo.GetValue (object, 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

Спасибо, что ответишь. Но я хотел получить значение экземпляра неизвестного перечисления, а не все возможные значения. Я просто использую это для тестирования-ui, потому что я ленив написать метод toString для каждого объекта данных, который я написал. Я никогда не буду использовать его в release-коде :) – 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 
    } 
}