简体   繁体   中英

My Enum is not recognized using reflection and PropertyInfo

I've a audit class that recovery everything by reflection. I need in my actual point know if an specific property is an Enum, but I'm getting a strange behavior:

During foreach iteration q.PropertyType.IsEnum return false. And using Quick watcher the property is really false, and the IsClass too. So this is basically nothing :)

Studying a little more about the problem I found that Nullable Enum returns false in IsEnum . How can I ignore this nullable and verify if the property is an enum or not?

IsEnum will return false when your property is of a nullable type. In this case, calling Nullable.GetUnderlyingType on q.PropertyType will return the type you want. Then you can check with IsEnum.

Edit: I've tried your enum, and it is fetchable. A call to Foo.GetEnumProperties returns an array with "TestProp" in it:

    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();
        }
    }

To do what you are trying to do, I use System.ComponentModel.DescriptionAttribute, then you can fetch it like this:

/// <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();
}

The general problem with not recognized Enums is that they can be Nullable and then the IsEnum doesn't work.
This is the case here, and using a @Skeet answer Checking if Type instance is a nullable enum in C# I solve my problem.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM