【问题标题】:Pass table type as T for generic list将表类型作为 T 传递给通用列表
【发布时间】:2018-05-08 06:30:06
【问题描述】:

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

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

我想在“实用程序”类中创建一个可重用的方法,在该类中我可以将表类型传递给该方法并创建该类型的列表。

类似:

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

【问题讨论】:

  • 您的问题与 EF 有什么关系?您只想创建一个空列表吗? var myList = new List&lt;T&gt;();

标签: c# list entity-framework generics


【解决方案1】:

你正在尝试做的事情不会编译(我相信你知道)

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&lt;T&gt; 并在其上调用 ToList()

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

如果您的目标是基于 System.Type 变量创建列表(如您的非编译代码示例中所示),则您必须混合使用反射和 Enumerable 的其他方法。 @Camilo 指出了一个 fairly relevant question and answer 可以在这些方面有所帮助。你的问题被标记为泛型而不是反射,所以我不想做太多假设。

【讨论】:

  • 可以添加this(或对其的引用),以提供另一个实际解决问题的选项
  • @CamiloTerevinto 是的,我什至不确定 OP 想要什么。我会在我的答案中添加一个链接,但我不会详细说明
  • 你想如何使用反射构造的泛型类型?无论如何,您都需要知道编译时间的类型才能访问该列表。
  • @OlivierJacot-Descombes 您应该能够访问 DbContext 的所有类型(因为这是 EF)
  • 是的,您可以通过context.Set&lt;T&gt; 以通用方式访问所有表格。我说的是@CamiloTerevinto 给出的链接,描述了如何对泛型类型使用反射。
【解决方案2】:

使用 EF,您有两个选择(除了直接访问您命名的 DbSet):

  1. 通用

    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);

【讨论】:

    猜你喜欢
    • 2020-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-24
    相关资源
    最近更新 更多