EnumHelper возвращает описание вместо значения Enum - PullRequest
0 голосов
/ 08 ноября 2019

Я использую метод EnumHelper и пытаюсь получить описание и enum значение (Id), как показано ниже:

EnumHelper:

public static class MyEnumHelper
{
    public static string GetDescription<T>(this T enumerationValue)
        where T : struct
    {
        System.Type type = enumerationValue.GetType();
        if (!type.IsEnum)
        {
            throw new ArgumentException("Must be Enum type", "enumerationValue");
        }
        //for the enum
        MemberInfo[] memberInfo = type.GetMember(enumerationValue.ToString());
        if (memberInfo != null && memberInfo.Length > 0)
        {
            object[] attrs = memberInfo[0]
                .GetCustomAttributes(typeof(DescriptionAttribute), false);

            if (attrs != null && attrs.Length > 0)
            {
                return ((DescriptionAttribute)attrs[0]).Description;
            }
        }
        return enumerationValue.ToString();
    }
}

Перечисление:

public enum StatusEnum
{
    [Description("Deleted")]
    Deleted= 0,

    [Description("Active")]
    Active= 1,

    [Description("Passive")]
    Passive= 2
}

Объект:

public class DemoEntity
{
    public int Id { get; set; }

    public StatusEnum StatusId { get; set; }

    [NotMapped]
    public string StatusName
    {
        get { return MyEnumHelper.GetDescription(StatusId); }
    }
}

Контроллер:

DemoEntity entity = DemoEntity();
entity.StatusId = StatusEnum.Passive; 
// !!! This returns "Passive" instead of its value 2. How can I get its value?

Однако, когда я пытаюсь присвоить Id значение enum с помощью функции строго типа enum, как показано выше, я все равно получаю его описание вместо Id. Есть идеи о том, где проблема?

Ответы [ 2 ]

2 голосов
/ 08 ноября 2019

просто приведите enum к int, если вам нужно значение

entity.Id = (int)StatusEnum.Passive; 
1 голос
/ 08 ноября 2019

Я бы, возможно, сделал это:

public enum Status
{
    Deleted= 0,
    Active= 1,
    Passive= 2
}

public class DemoEntity
{
    public int Id { get; set; }

    public Status Status { get; set; }

    [NotMapped]
    public string StatusName
    {
        get { return this.Status.ToString("g"); }
    }

    [NotMapped]
    public int StatusId
    {
        get { return (int)this.Status; }
    }
}
  • Не добавляйте суффикс Enum к своим перечислениям - вы не делаете это для классов (DemoEntityClass?), А Intellisense рисует ясноеразличие между классом и перечислением (например). Microsoft этого не делает (StringSplitOptions, а не StringSplitOptionsEnum)
  • Если ваши атрибуты описания совпадают со значениями вашего перечисления (как и у вас), ToString ("g") проще, запекается в видепревращение имени перечисления в строку
  • Перечисления называются целочисленными;Целые числа могут быть добровольно брошены туда и обратно. Если вы пытаетесь привести int к перечислению, и оно не является членом перечисления, оно просто ведет себя как то же самое значение int (((Status)3).ToString() возвращает «3»);

Рассмотримбиблиотека Enums.Net , если вы увлекаетесь работой с enums

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