Мой Enum не распознается с помощью отражения и PropertyInfo - PullRequest
6 голосов
/ 17 мая 2011

У меня есть аудиторский класс, который восстанавливает все с помощью рефлексии.Мне нужно, чтобы я знал, является ли конкретное свойство Enum, но я получаю странное поведение:

Во время итерации foreach q.PropertyType.IsEnum возвращает false.И при использовании Quick watcher свойство действительно ложно, и IsClass тоже.Так что это в основном ничего:)

Изучая немного больше о проблеме, я обнаружил, что Nullable Enum возвращает false в IsEnum.Как я могу игнорировать этот обнуляемый и проверить, является ли свойство перечислением или нет?

Ответы [ 3 ]

7 голосов
/ 18 мая 2011

IsEnum вернет false, когда ваша собственность имеет тип NULL. В этом случае вызов Nullable.GetUnderlyingType для q.PropertyType вернет нужный тип. Тогда вы можете проверить с IsEnum.

2 голосов
/ 17 мая 2011

Редактировать: я попробовал ваше перечисление, и его можно получить. Вызов 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 голосов
/ 18 мая 2011

Общая проблема с нераспознанными перечислениями заключается в том, что они могут иметь значение Nullable, и тогда IsEnum не работает.
Это именно тот случай, и с помощью ответа @Skeet Проверка, является ли экземпляр типа обнуляемым перечислением в C # Я решаю свою проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...