Вызов списка классов stati c путем отражения C# - PullRequest
0 голосов
/ 12 июля 2020

У меня есть серия списков C# stati c в проекте API, которые очень похожи на простой пример, определенный здесь.

using System.Collections.Generic;

namespace myproject.api.PropModels
{
  public class CommonSelectOptionsYesNoItem
  {
        public int Id { get; set; }
        public string Title { get; set; }
  }

  public static class CommonSelectOptionsYesNo
  {
    public static readonly List<CommonSelectOptionsYesNoItem> Table = new List<CommonSelectOptionsYesNoItem>
    {        
          new CommonSelectOptionsYesNoItem { Id = 0, Title = "No",},           
          new CommonSelectOptionsYesNoItem { Id = 1, Title = "Yes",},         
    };
  }
}

Эти модели устанавливают sh общую справочную информацию между веб-приложением Javascript и API, который обслуживает приложение.

Пользователи загружают в API данные электронной таблицы, которые включают имя класса списка и заголовок элемента в списке. Мне нужно определить, какой идентификатор связан с заголовком - если он есть.

Например, я знаю, что эта информация находится в списке CommonSelectOptionsYesNo.Table, а свойство Title - «Да». Таким образом, я могу определить, что Id равен 1.

В принципе, я могу настроить метод переключения / случая, который выбирает список, обозначенный как CommonSelectOptionsYesNo.Table, а затем получает значение Id. Однако существует более 60 таких списков ссылок, и они продолжают расти.

Могу ли я использовать отражение для вызова экземпляра списка c только для чтения на основе имени объекта класса stati c - в этом пример CommonSelectOptionsYesNo.Table?

1 Ответ

0 голосов
/ 14 июля 2020

После дальнейших исследований был разработан следующий метод для вызова списка stati c только для чтения и возврата идентификатора для любого заданного значения «Title».

propModelKey сохраняется со статусом c list в словаре всех списков.

Список может быть извлечен как объект, зная, что список всегда объявляется с именем свойства «Таблица».

Свойства Объекты списка могут различаться в зависимости от назначения списка, но они всегда имеют свойства «Идентификатор» и «Заголовок». Сериализация и десериализация объекта с помощью простого объекта класса "SelectOptions" генерирует список, который можно запросить для извлечения идентификатора, соответствующего отправленной строке заголовка.

    // This will return an Id of 1 from the simple YesNo list
    var id = GetSelectListIndex("QuestionOneId", "Yes"); 

    // Method to extract the Id of a value in a list given the list model key
    private static int? GetSelectListIndex(string propModelKey, string title)
    {
        if (SelectListModelMap.ContainsKey(propModelKey))
        {
            var model = SelectListModelMap[propModelKey];

            var typeInfo = Type.GetType("myproject.api.PropModels." + model).GetTypeInfo();

            var fieldInfo = typeInfo.DeclaredFields.FirstOrDefault(x => x.Name == "Table");

            var json = JsonConvert.SerializeObject(fieldInfo.GetValue(new object()));

            var dictionary = JsonConvert.DeserializeObject<List<SelectOptions>>(json);

            var index = dictionary.FirstOrDefault(x => x.Title == title)?.Id;

            return index;
        }

        return null;
    }

    // Dictionary of lists with model key and class name
    public static Dictionary<string, string> SelectListModelMap => new Dictionary<string, string>
    {
        { "QuestionOneId", "CommonSelectOptionsYesNo" },
        { "CountryId", "CommonSelectOptionsCountries" },
        // ... other lists
    };

    // generic class to extract the Id / Title pairs
    public class SelectOptions
    {
       public int Id { get; set; }
       public string Title { get; set; }
    }
...