动态填充没有具体数据类型的通用对象列表
Dynamically populate generic list of objects without concrete data type
我有一个大约有 100 个左右的数据库 table。我想做的是以下内容:
- 获取数据库中 table 的列表。
- 循环遍历列表中的每个table,并将table中的所有记录select放入数据Table。
- 对于每个数据 Table,动态生成一个 POCO classes
的通用列表
- 读取每个数据行并填充对象,然后将其添加到列表中。
我顺利完成了第 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 代码并从数据库中反向工程实体。
- 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 });
我有一个大约有 100 个左右的数据库 table。我想做的是以下内容:
- 获取数据库中 table 的列表。
- 循环遍历列表中的每个table,并将table中的所有记录select放入数据Table。
- 对于每个数据 Table,动态生成一个 POCO classes 的通用列表
- 读取每个数据行并填充对象,然后将其添加到列表中。
我顺利完成了第 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 代码并从数据库中反向工程实体。
- 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 });