Передать тип таблицы как T для общего списка - PullRequest
0 голосов
/ 08 мая 2018

У меня есть таблица с именем myTable. Используя EntityFramework, я могу создать список запросов myTable, например:

List<myTable> myList = context.myTables.ToList();

Я хочу создать метод многократного использования в классе «Утилиты», где я могу передать этому методу тип таблицы и создать список этого типа.

Что-то вроде:

public static void ListFromType(Type suppliedTableType)
{
    List<supliedTableType> myList = new List<suppliedTableType>();
}

Ответы [ 2 ]

0 голосов
/ 08 мая 2018

С EF у вас есть два варианта (в дополнение к прямому доступу к вашим именованным DbSets):

  1. Generic

    List<T> myList = context.Set<T>().ToList();
    
  2. с параметром Type

    object[] untypedArray = context.Set(typeOfSomeTable).ToArray();
    // or
    List<object> untypedList = context.Set(typeOfSomeTable).ToList();
    

В варианте 2 вы получаете только нетипизированные объекты, так как тип не известен во время компиляции.

Примечание. Универсальные коллекции имеют преимущество, позволяющее строго типизированный доступ к их элементам. «Строго типизированный» всегда означает, что совместимость типов операций с этим типом проверяется компилятором, поэтому тип должен быть известен во время компиляции.

Предположим, у вас есть метод, принимающий параметр Type. Какой тип должен иметь список? Мы не знаем этого во время компиляции.

Type type = ...;
WhichTypeShouldWeUseHere list = ListFromType(type);
0 голосов
/ 08 мая 2018

То, что вы пытаетесь сделать, не скомпилируется (как я уверен, вы знаете)

public static void ListFromType(Type suppliedTableType)
{
    List<supliedTableType> myList = new List<suppliedTableType>();
}

Во-первых, метод void, что означает, что он ничего не возвращает, во-вторых, вы используете экземпляр System.Type в качестве параметра универсального типа, который не работает.

Когда вы смотрите на проблему, возникает вопрос: зачем вообще это вообще делать? Вам всегда нужно знать тип для создания экземпляра списка, так почему бы просто не размещать список напрямую все время? Зачем вызывать вспомогательный метод, чтобы просто сделать:

List<myTable> someList = new List<myTable>();
// or to save yourself from typing myTable twice
var someList = new List<myTable>();

Если вы действительно хотите какой-нибудь модный Linq, который достигает той же самой вещи , вы можете использовать Enumerable.Empty<T> и вызывать ToList() на нем:

List<myTable> someList = Enumerable.Empty<myTable>().ToList();

Если ваша цель - создать списки на основе переменной System.Type (как указано в некомпилируемом примере кода), вам придется использовать смесь методов Reflection и других Enumerable. @Camilo указал довольно актуальный вопрос и ответ , который может помочь в этом направлении. Ваш вопрос был помечен с помощью Generics, а не Reflection, поэтому я не хочу делать слишком много предположений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...