繁体   English   中英

将表类型作为T传递给常规列表

[英]Pass table type as T for generic list

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

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

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

就像是:

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

您尝试执行的操作不会编译(我确定您知道)

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

首先,该方法为void ,这意味着它什么也不返回,其次,您正在使用System.Type实例作为void的通用类型参数。

当您查看问题时,就会想到一个问题,为什么还要这样做呢? 您始终必须知道创建列表实例的类型,所以为什么不总是一直分配列表呢? 为什么要调用辅助方法来简单地执行以下操作:

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指出了一个相当相关的问题和答案 ,可以帮助您解决这些问题。 您的问题被标记为泛型而非反射,所以我不想做太多假设。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM