【发布时间】:2017-07-29 02:22:22
【问题描述】:
我有一个包含大约 100 个表的数据库。我想做的是以下几点:
- 获取数据库中的表列表。
- 遍历列表中的每个表,并将表中的所有记录选择到数据表中。
- 对于每个数据表,动态生成 POCO 类的通用列表
- 读取每个数据行并填充对象,然后将其添加到列表中。
我很好地完成了第 1 项和第 2 项。但是对于第 3 项和第 4 项,我遇到了麻烦。这是我的代码:
Type type = Type.GetType(tableName);
var list = Utility.BindList<type>(dataTable);
我得到的例外是:“'type' 是一个变量,但用作类型。”
仔细想想,这是有道理的。当然,如果我输入实际类而不是类型,它可以正常工作:
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 });
【问题讨论】:
-
其实这是一个不同的问题。我要做的是将自定义类的具体数据类型传递给通用函数。
-
不,不是。您没有具体的数据类型。您只有一种类型,运行时已知(您自己在问题标题中编写)
-
实际上部分解决方案与您引用的线程重叠。然而,缺少的大部分是获取“类型”变量以避免获取空值(第一行)的方式。不过,非常感谢您的帮助。
标签: c# reflection datatable generic-list dynamic-binding