Как получить значение по умолчанию для перечисления из переменной типа - PullRequest
0 голосов
/ 30 мая 2018

Учитывая объект (неизвестный во время разработки), я зацикливаюсь на его свойствах для выполнения некоторых процессов.Для каждого свойства я должен проверить, отличается ли его значение от значения по умолчанию.

foreach(var p in propertyInfos)
{
    if (something) { ... }
    else if (p.PropertyType.IsEnum)
    {
        object oDefault = GetDefaultValueOfThisPropertyByWhateverMethod();
        if (oDefault == null)
            oDefault = default(p.PropertyType); // not valid
        var vValue = p.GetValue(myObject);

        if (!oDefault.Equals(vValue))
            // Do something enum specific when value is not the default one.
    }
}

Как я могу этого достичь, зная, что могут существовать перечисления, которые не содержат элементов со значением 0?

1 Ответ

0 голосов
/ 30 мая 2018

Значение по умолчанию enum равно 0 ... Даже если для 0. не определено значение. В конце вы всегда можете (EnumType)123 для любого enum.enum не проверять / ограничивать их «действительные» значения.Присвойте только некоторые метки некоторым конкретным значениям.

Обратите внимание, что 0, о котором я говорил ранее, является "типизированным" значением ... Так что это (EnumType)0, а не (int)0 ... Вы можете:

object oDefault = Enum.ToObject(p.PropertyType, 0);

Работаетдаже с не-1012 * основанными на перечислениях, такими как:

enum MyEnum : long
{
}

Очевидно, что вы могли бы даже:

object oDefault = Activator.CreateInstance(p.PropertyType);

, потому что new SomeEnumType() равно 0.

...