关于c#:Force Framework使用枚举实体名称而不是其值

Force Framework to use Enum Entity Name instead of its Value

本问题已经有最佳答案,请猛点这里访问。

我创建了一个ASP.NET MVC 4 Web应用程序。在这个应用程序中,我实现了几个RESTWebServices,这里出现了我的问题:是否可以强制对象序列化使用枚举实体名而不是它们的值?

这是我的枚举:

1
    public enum ReturnCode { OK, InvalidParameter }

这就是我得到的:

1
2
3
4
{
  "returnCode": 0,
  "data": null
}

但这正是我想要的:

1
2
3
4
{
  "returnCode": OK,
  "data": null
}

有没有办法做到这一点?


您可以使用JSonConverter。

在这个问题中,json.net StringEnumConverter有一个本机版本,它将枚举的json序列化为字符串。

请注明您的财产:

1
2
[JsonConverter(typeof(StringEnumConverter))]
public enum ReturnCode { OK, InvalidParameter }

或者使用webapi json.net自定义日期处理中的配置示例在全局序列化程序设置中注册。


是的,你能做到。您需要声明附加的字符串属性,并在序列化/反序列化时使用它。

例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[DataContract]
public class MyResource
{
    [DataMember]
    public string Data { get; set; }

    public ReturnCode Code { get; set; }

    [DataMember(Name ="returnCode")]
    string ReturnCodeString
    {
        get { return this.Code.ToString(); }
        set
        {
            ReturnCode r;
            this.Code = Enum.TryParse(value, true, out r) ? r : ReturnCode.OK;
        }
    }
}

因此,现在可以将枚举值作为字符串(从服务器和客户机两个方向)传递,即:

1
2
3
4
{
  "returnCode":"OK",
  "data": null
}

1
2
3
4
{
  "returnCode":"InvalidParameter",
  "data": null
}


如果没有更好地理解您的使用模式,很难提出建议……但同样如此。

使枚举成为私有字段。

使用getter(返回私有枚举字段的实体名称)和setter(使用enum.parse设置私有字段值)生成公共字符串属性