繁体   English   中英

如何在 .NET Core Web API 中的字典键中将枚举转换为 int

[英]How do I convert enum to int in Dictionary key in .NET Core Web API

假设我有一个enum

public enum Countries {
    France, GreatBritain, Japan, CostaRica, ...
}

假设我在 WebApi 控制器中有以下操作

[HttpGet]
public ActionResult<Dictionary<Countries, int> Get() {
   return new Dictionary<Countries, int> {
      [Countries.France] = 10,
      [Countries.CostaRica] = 50
      ...
   }
}

发送到客户端的 JSON 是"France": 10, "CostaRica": 50等。

我更喜欢用 0:10 0: 10, 4: 50代替。 客户不知道枚举值; 只有整数索引和描述(如“法国”或“哥斯达黎加”)。 我正在使用相同的枚举为数据库播种 - 所以我相信 ID 匹配。

我尝试了不同的JsonConverter选项,但它们似乎都假定标量值。

注意:这是一个简化的例子; 真正的商业应用要复杂得多。 显然,在服务器上使用 enum 有很大的好处,而无需在返回客户端之前创建Dictionary<int, int>并转换所有键。 我很确定 Json.NET 可以转换它 - 我只是想知道如何帮助它。

我的应用程序是 .NET Core 2.2 这个例子也是如此。 我知道 3.0 对 Json.Net 的处理略有不同; 但我认为这个转换问题与版本无关

这是转换为 int 并返回ActionResult<Dictionary<int, int>> ,这将是这样的:

[HttpGet]
public ActionResult<Dictionary<int, int>> Get() {
   return new Dictionary<Countries, int> {
      [Countries.France] = 10,
      [Countries.CostaRica] = 50
      ...
   }.ToDictionary(x => (int)x.Key, x => x.Value);
}

更新

只是想分享一下,如果您需要使用反射将任何Enum转换为字典,您可以执行以下操作:

public Dictionary<string, object> GetEnumAsDictionary<TEnum>() where TEnum : System.Enum
{
    var result = new Dictionary<string, object>();

    var _fields = typeof(TEnum).GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static);

    for (int i = 0; i < _fields.Length; i++)
    {
        result.Add(_fields[i].Name, _fields[i].GetRawConstantValue());
    }

    return result;
}

用法 :

var enDic = GetEnumAsDictionary<Countries>();

GetRawConstantValue返回object ,这就是我将字典值类型作为对象的原因。 但是很容易将它绑定到其他数据类型或使其通用。

我认为这将是有用的分享。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM