Как преобразовать enum в int в словарном ключе. NET Core Web API - PullRequest
0 голосов
/ 01 марта 2020

Предположим, у меня есть enum

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

И, предположим, у меня есть следующее действие в WebApi Controller

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

JSON, которое отправляется клиенту: "France": 10, "CostaRica": 50 , et c.

Я бы очень предпочел вместо этого 0: 10, 4: 50. Клиент не знает значений перечисления; только целочисленный индекс и описание (например, «Франция» или «Коста-Рика»). Я заполняю базу данных, используя тот же enum - поэтому я уверен, что идентификаторы совпадают.

Я пробовал разные варианты JsonConverter, но все они, кажется, принимают скалярное значение.

Примечание: это упрощенный пример; Реальное бизнес-приложение намного сложнее. Очевидно, что использование enum на сервере имеет большое преимущество без создания Dictionary<int, int> и приведения всех ключей перед возвратом к клиенту. Я почти уверен, что Json. NET может конвертировать его - я просто могу понять, как помочь.

Мое приложение. NET Core 2.2 ; так же и этот пример. Я знаю, что 3.0 обрабатывает Json. Net немного по-другому; но я не думаю, что эта проблема преобразования зависит от версии

1 Ответ

2 голосов
/ 01 марта 2020

Это вопрос преобразования в 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 в словарь с помощью Reflection, вы можете сделать что-то вроде этого:

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 Вот почему я сделал тип значения словаря как объект. но его легко привязать к другим типам данных или сделать его обобщенным c.

Я подумал, что было бы полезно поделиться.

...