【问题标题】:How to tell our asp.net core Web Api service how to serialize enum objects如何告诉我们的asp.net核心Web Api服务如何序列化枚举对象
【发布时间】:2019-04-07 01:00:07
【问题描述】:

我们目前正在重写我们多年前编写的 API 服务。我们正在使用 .Net Core 2.1 和 MVC 对其进行更新。搜索后我无法弄清楚或找到一些扭结。最大的一个是客户发送的枚举,是枚举描述。无论出于何种原因,程序员都在每个描述(A、B、C、D...等)中添加了一个字母,因此许多客户将这些字母作为其有效的枚举发送。现在它不起作用。我们不能更改名称,因为它也在使用中。而且我不能手动转换它(据我所知),因为 MVC 负责为我们的控制器序列化对象。

示例

public enum RentCode
{
    [Description("")]
    None = 0,

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

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

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

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

我怎样才能得到它,以便 MVC 在序列化对象时处理数字、枚举值和描述?

【问题讨论】:

  • 您确实需要修改您的问题以正确描述您的需求。在阅读了它和下面答案中的 cmets 之后,这真的与 asp.net 完全无关,与序列化有关(它不关心什么叫序列化,asp.net 或控制台或 winforms,它是无关紧要的) .
  • 感谢您的建议,我修改了我的问题,希望它能更好地吸引愿意回答我问题的人。如果我知道解决方案是什么,我相信我可以更好地措辞,但因为我正在寻找答案,我不确定如果我是 .net47 或 .net 核心,解决方案是否会有所不同。或者如果我可以在启动时做一些事情,或者 MVC 内置的东西可以提供帮助。如果是这样,如果我有启动文件或 Global.asax 文件,知道哪个版本会改变。所以我很高兴知道这些现在不那么重要了……稍后投反对票。
  • 所以 asp.net-core 使用 JSON.Net 来序列化对象。超级简单的方法就是使用EnumMember。

标签: c# asp.net-core-mvc asp.net-core-2.0 asp.net-core-webapi


【解决方案1】:

我使用扩展方法来实现:

  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
}

【讨论】:

  • 对,我们有这些扩展方法,但是对象正在为我们序列化,当它进入控制器时,枚举已经为空。我们查看了原始请求以了解他们发送的内容。
  • 是 JSON 序列化的吗?您可以添加属性,以便 newtonsoft 知道如何对其进行序列化。
猜你喜欢
  • 1970-01-01
  • 2020-05-12
  • 2016-05-13
  • 2019-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-30
相关资源
最近更新 更多