Можно ли динамически выбирать тип LiteCollection <T>в сигнатуре метода? - PullRequest
0 голосов
/ 29 ноября 2018

У меня есть пользовательский класс Customer и внутри другого класса метод, который возвращает список на основе LiteCollection из LiteDB, типизированный с использованием класса Customer в подписи.Я хотел бы знать, возможно ли создание метода, который динамически выбирает, какой класс использует тип, то есть, если я могу передать в качестве параметра тип класса LiteCollection, возвращаемый при вызове метода.

код выглядит следующим образом:

public static LiteCollection<Customer> GetCustomers()
        {
            var collection = ConnectToDB().GetCollection<Customer>("customers");

            return collection;
        }

1 Ответ

0 голосов
/ 29 ноября 2018

Как насчет:

public static LiteCollection<T> Get(string tableName)
{
    return ConnectToDB().GetCollection<T>(tableName);
}

Это называется:

var table = Get<Customer>("customers");

Обновление

К сожалению, на самом деле невозможно избавиться от универсального типа,в противном случае ваш потребляющий код не знает, что он возвращает.Таким образом, минимум, который был бы возможен, был бы

var table = Get<Customer>();

В этом случае вашей реализации нужен какой-то тип преобразователя из типа в имя таблицы.Для этой цели я мог бы подумать о трех возможностях (которые вы также можете объединить):

  • В классе есть внутренний Dictionary<Type, string>, в который вручную вводятся все имена таблиц для данного типа.
  • Соглашение состоит в том, что для каждого T имя таблицы является множественной строкой имени типа, тогда вам необходим метод множественного числа , который возвращает Pluralize(typeof(T).Name).
  • Отражая васитерируйте производные DBContext, извлеките все свойства DBSet<> и предварительно заполните словарь из первой возможности, используя общий аргумент из DBSet<> и имя свойства.
...