Как рассказать нашему базовому сервису Web Api asp.net, как сериализовать перечисляемые объекты - PullRequest
0 голосов
/ 02 ноября 2018

В настоящее время мы переписываем наш API-сервис, который был написан много лет назад. Мы обновляем его, используя .Net Core 2.1 и MVC. Есть несколько перегибов, которые я не могу выяснить или найти после поиска. Самым большим является перечисление, которое отправляют клиенты, это описание перечисления. По какой-либо причине программист (ы) добавил письмо к каждому описанию (A, B, C, D ... и т. Д.), Которое многие клиенты отправляют в письмах, так как их перечисления работали. Теперь это не работает. Мы не можем изменить имя, потому что оно также используется. И я не могу вручную преобразовать его (насколько я вижу), потому что MVC заботится о сериализации объекта для нашего контроллера.

* ** 1003 тысяча два * Пример
public enum RentCode
{
    [Description("")]
    None = 0,

    [Description("A")]
    Buying = 1,

    [Description("B")]
    Renting= 2,

    [Description("C")]
    Own = 3,

    [Description("D")]
    Land = 4
}

Как я могу получить его, чтобы MVC обрабатывал число, значение перечисления и описание при сериализации объекта?

1 Ответ

0 голосов
/ 02 ноября 2018

Я использую метод расширения для достижения этой цели:

  public static class EnumExtensions
        {
public static string GetDisplayName(this Enum enu)
        {
            var attr = GetDisplayAttribute(enu);
            return attr != null ? attr.Name : enu.ToString();
        }

        public static string GetDescription(this Enum enu)
        {
            var attr = GetDisplayAttribute(enu);
            return attr != null ? attr.Description : enu.ToString();
        }

    private static DisplayAttribute GetDisplayAttribute(object value)
            {
                Type type = value.GetType();
                if (!type.IsEnum)
                {
                    throw new ArgumentException(string.Format("Type {0} is not an enum", type));
                }

                // Get the enum field.
                var field = type.GetField(value.ToString());
                return field == null ? null : field.GetCustomAttribute<DisplayAttribute>();
            }
        }

Я называю это так:

//status is an instance of the enum
myObject.StatusLabel = status.GetDisplayName();

И мое перечисление выглядит так:

public enum Status
    {
    [Display(Name = "In Progress")]
            InProgress = 1,
            [Display(Name = "Complete")]
            Completed = 2
}
...