我有一张名为myTable
的表格。使用EntityFramework我可以创建一个查询myTable
的列表,如下所示:
List<myTable> myList = context.myTables.ToList();
我想在“Utilities”类中创建一个可重用的方法,我可以在该方法中传递一个表类型并创建该类型的List。
类似的东西:
public static void ListFromType(Type suppliedTableType)
{
List<supliedTableType> myList = new List<suppliedTableType>();
}
答案 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):
通用
Type
使用object[] untypedArray = context.Set(typeOfSomeTable).ToArray();
// or
List<object> untypedList = context.Set(typeOfSomeTable).ToList();
参数
Type
对于变体2,您只能获得无类型的对象,因为在编译时不知道该类型。
注意:通用集合的优点是允许对其项目进行强类型访问。 “强类型”总是意味着编译器会测试此类操作的类型兼容性,因此,必须在编译时知道该类型。
假设您有一个接受Type type = ...;
WhichTypeShouldWeUseHere list = ListFromType(type);
参数的方法。列表应该包含哪种类型?我们在编译时不知道它。
{{1}}