2017-07-29 70 views
1

我有一个大约有100左右的表的数据库。我想要做的是以下几点:动态填充没有具体数据类型的对象的通用列表

  1. 获取数据库中的表列表。
  2. 循环遍历列表中的每个表,并将表中的所有记录选择到数据表中。
  3. 对于每个数据表,动态生成POCO类的通用列表
  4. 读取每个数据行并填充对象,然后将其添加到列表中。

我正在通过项目1和2罚款。但对于项目3和4,我遇到了麻烦。下面是我的代码有:

Type type = Type.GetType(tableName); 
var list = Utility.BindList<type>(dataTable); 

我得到的例外是:“‘类型’是一个变量,但使用像一个类型”

思考它,这是有道理的。当然,如果我输入实际类而不是类型,它工作正常:

Type type = Type.GetType(tableName); 
var list = Utility.BindList<Person>(dataTable); 

但我不想要硬编码任何实际的类。顺便说一句,这里是的BindList方法,我上面调用的签名(这部分工作正常):

public static List<T> BindList<T>(DataTable dt) 
{ 
    // Turn Data Table into Generic List 

    return list 
} 

有没有人对如何做到这一点有什么建议?

谢谢!


更新:解决方案如下,由Tyress提供:

Type type = Assembly.Load("[NAMESPACE PATH]").GetTypes().First(t => t.Name == tableName); 
var method = typeof(Utility).GetMethod("BindList").MakeGenericMethod(type); 
var bindResult = method.Invoke(null, new[] { datatable }); 
+0

[泛型在C#,使用一个变量作为参数的类型](的可能的复制https://stackoverflow.com/questions/2107845 /泛型中的c-using-type-of-a-variable-as-parameter) –

+0

实际上这是一个不同的问题。我想要做的是将自定义类的具体数据类型传入通用函数。 –

+0

不,它不是。您没有具体的数据类型。你只有一个类型,它是运行时已知的(你自己写在你的问题标题中) –

回答

1
  • 对于每个数据表,动态地生成的POCO泛型列表 类
  • 但我不希望有硬编码任何实际的类。

    我觉得这两个说法是矛盾的吗?你需要什么POCO课程? dynamic/ExpandoObject可用于您的通用功能(而不是type),但我不明白为什么您不能只使用Dictionary如果您不需要POCO类。

    - 基于我的理解

    编辑:

    var method = typeof(Utility).GetMethod("BindList").MakeGenericMethod(type); 
    var bindResult = method.Invoke(null, new[] { dataTable }); 
    
    +0

    也许我没有解释正确。假设我们在数据库中有两个名为“Person”和“Address”的表。我试图做的是循环遍历所有这些类,并将数据对象类的类数据类型逐个传递给泛型函数,让它填充该对象类型的泛型列表,然后返回列表。 POCO类与EF类基本相似,即使它们实际上与EF没有关系。数据库中的每个表列在POCO类中都有一个具有相同数据类型的属性。 –

    +0

    @DigiOzMultimedia哦,我现在看到,我认为这些类还没有存在,你想在运行时使它们变得复杂。我会根据我的理解编辑我的答案 – Tyress

    +1

    完美的Tyress!我必须改变的唯一方法就是我得到“type”变量的方式,因为Type.GetType只在类与执行代码在同一个程序集中时才起作用。因为该类在不同的程序集中,所以我不得不使用“Type type = Assembly.Load(”[ASSEMBLY NAMESPACE“)。GetTypes()。First(t => t.Name == tableName);”获取类型。从那里你的代码完美无缺地工作。非常感谢您的帮助! –

    0

    简单地去实体框架,而不是自己发明了一次以上。

    首先使用EF代码,并从数据库中反向工程实体。

    +0

    这只是一个小问题。 EF非常慢,并且不支持SQL中的5000多个表格,我试图支持其他项目(对于这个只有100个,但我将它用作其他模板的模板)。通过使用ADO.NET,我设法将应用程序的速度提高了100倍,并支持尽可能多的数据库表。 –