Может ли GetMember() вернуть пустой массив для перечисления?

Взгляните на это enum метод расширения для получения Description атрибут:

public static string GetDescription(this Enum enumValue)
{
    var memberInfo = enumValue.GetType().GetMember(enumValue.ToString());

    if (memberInfo.Length < 1)
        return null;

    var attributes = memberInfo[0].GetCustomAttributes(typeof(DescriptionAttribute), false);

    return attributes.Length > 0 ? ((DescriptionAttribute)attributes[0]).Description : enumValue.ToString();
}

И пример enum с Description атрибуты:

public enum Colors
{
    [Description("Navy Blue")]
    Blue,
    [Description("Lime Green")]
    Green
}

И, наконец, использование метода расширения:

var blue = Colors.Blue;
Console.WriteLine(blue.GetDescription());
// Console output: Navy Blue

У меня вопрос, когда дело доходит до enum с, это if (memberInfo.Length < 1) проверить надо? Будет ли возвращенный массив из GetMember() когда-нибудь быть пустым для enum? Я знаю, что вы можете объявить пустым enum как это:

public enum Colors
{
}

Но я не знаю, можете ли вы даже создать переменную типа Colors затем...

var green = Colors. // What goes here?

Я хотел бы удалить if (memberInfo.Length < 1) проверьте, но я не хочу делать это, если это вызовет проблемы позже (я не могу придумать причину, по которой мне когда-нибудь понадобится пустое enum, но другие разработчики, вероятно, будут использовать GetDescription() метод расширения).

1 ответ

Решение

Вы можете создать переменную типа Colors даже если значение не определено:

public enum Colors { }

var color2 = (Colors)100; // with casting
Colors color2 = default; // default value '0'
Другие вопросы по тегам