将表类型作为T传递给通用列表

时间:2018-05-07 21:33:45

标签: c# list entity-framework generics

我有一张名为myTable的表格。使用EntityFramework我可以创建一个查询myTable的列表,如下所示:

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

我想在“Utilities”类中创建一个可重用的方法,我可以在该方法中传递一个表类型并创建该类型的List。

类似的东西:

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

2 个答案:

答案 0 :(得分:3)

你要做的事情不会编译(我相信你知道)

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

首先,该方法为void,这意味着它不返回任何内容,其次,您使用System.Type实例作为泛型类型参数,但不起作用。

当你看到这个问题时,它会引发一个问题,为什么要这样做呢?您始终必须知道创建列表实例的类型,那么为什么不直接直接分配List?为什么要调用辅助方法来简单地执行:

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已经指出fairly relevant question and answer可以帮助这些方面。你的问题被标记为Generics而不是Reflection,所以我不想做太多的假设。

答案 1 :(得分:0)

使用EF,您有两个选项(除了直接访问您指定的DbSets):

  1. 通用

    Type
  2. 使用object[] untypedArray = context.Set(typeOfSomeTable).ToArray(); // or List<object> untypedList = context.Set(typeOfSomeTable).ToList(); 参数

    Type
  3. 对于变体2,您只能获得无类型的对象,因为在编译时不知道该类型。

    注意:通用集合的优点是允许对其项目进行强类型访问。 “强类型”总是意味着编译器会测试此类操作的类型兼容性,因此,必须在编译时知道该类型。

    假设您有一个接受Type type = ...; WhichTypeShouldWeUseHere list = ListFromType(type); 参数的方法。列表应该包含哪种类型?我们在编译时不知道它。

    {{1}}