2011-05-17 66 views
5

我有一个审计类,通过反射恢复一切。我需要在我的实际知道如果一个特定的属性是一个枚举,但我得到一个奇怪的行为:我的枚举不被识别使用反射和PropertyInfo

在foreach迭代q.PropertyType.IsEnum返回false。并且使用Quick观察器,该属性是非常错误的,而IsClass也是如此。所以这是基本上没有:)

学习一点关于这个问题我发现Nullable Enum在IsEnum返回false。我怎样才能忽略这个可空对象并验证属性是否是一个枚举?

+5

Nit:从30-39的数字拼写为“三十”,而不是“第三”。 – 2011-05-17 19:40:43

+0

@JS邦,请重点关注。 :D – Custodio 2011-05-17 19:43:24

+0

@Custódio什么是ReflectionUtil? – 2011-05-17 19:46:05

回答

5

当您的属性为可为空类型时,IsEnum将返回false。在这种情况下,在q.PropertyType上调用Nullable.GetUnderlyingType将返回所需的类型。然后你可以检查IsEnum。

2

编辑:我试过你的枚举,它是可取的。到Foo.GetEnumProperties调用返回与它“TestProp”的数组:

public enum MyEnum 
    { 
     [XmlEnumAttribute("Twenty and Something")] 
     TwentyTree = 1, 
     [XmlEnumAttribute("Thirty and Something")] 
     Thirdyfour 
    } 

    class Foo 
    { 
     public MyEnum TestProp { get; set; } 


     /// <summary> 
     /// Get a list of properties that are enum types 
     /// </summary> 
     /// <returns>Enum property names</returns> 
     public static string[] GetEnumProperties() 
     { 
      MemberInfo[] members = typeof(Foo).FindMembers(MemberTypes.Property, BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance, null, null); 
      List<string> retList = new List<string>(); 
      foreach (MemberInfo nextMember in members) 
      { 
       PropertyInfo nextProp = nextMember as PropertyInfo; 
       if (nextProp.PropertyType.IsEnum) 
        retList.Add(nextProp.Name); 
      } return retList.ToArray(); 
     } 
    } 

做你正在尝试做的,我用System.ComponentModel.DescriptionAttribute,那么你可以这样取,

/// <summary> 
/// Get the description for the enum 
/// </summary> 
/// <param name="value">Value to check</param> 
/// <returns>The description</returns> 
public static string GetDescription(object value) 
{ 
    Type type = value.GetType(); 
    string name = Enum.GetName(type, value); 
    if (name != null) 
    { 
     FieldInfo field = type.GetField(name); 
     if (field != null) 
     { 
      DescriptionAttribute attr = Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute)) as DescriptionAttribute; 
      if (attr != null) 
      { 
       string desc = attr.Description; 
       return desc; 
      } 
     } 
    } 
    return value.ToString(); 
} 
+0

这个问题旨在发现MyEnum声明有什么问题。 – Custodio 2011-05-17 20:03:14

+1

你的枚举声明没有问题。你只是想以一种不起作用的方式获取属性。 – 2011-05-17 20:05:00

+0

不错。所以,适应我的问题有什么更好的方式来返回一个布尔值,说如果一个属性是枚举或不 – Custodio 2011-05-17 20:13:12