[英]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之外):
泛型
List<T> myList = context.Set<T>().ToList();
带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.