动态填充没有具体数据类型的通用对象列表

Dynamically populate generic list of objects without concrete data type

我有一个大约有 100 个左右的数据库 table。我想做的是以下内容:

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

我顺利完成了第 1 项和第 2 项。但是对于第 3 项和第 4 项,我遇到了麻烦。这是我的代码:

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

我得到的异常是:“'type' 是一个变量,但像类型一样使用。”

而且想想也是有道理的。当然,如果我输入实际的 class 而不是键入它就可以正常工作:

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

但我不想硬编码任何实际的 classes。顺便说一句,这是我在上面调用的 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 });

干脆去 entity framework 而不是自己再发明一次。

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

  1. For each Data Table, dynamically generate a Generic List of POCO classes

But I don't want to have to hard code any actual classes.

我觉得这两种说法自相矛盾?你需要 POCO 类 做什么? dynamic / ExpandoObject 可用于您的通用函数(而不是 type),但我真的不明白为什么您不能只使用 Dictionary 如果您不这样做不需要 POCO 类.

--

根据我的理解编辑:

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