【问题标题】:Dynamically populate generic list of objects without concrete data type动态填充没有具体数据类型的通用对象列表
【发布时间】:2017-07-29 02:22:22
【问题描述】:

我有一个包含大约 100 个表的数据库。我想做的是以下几点:

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

我很好地完成了第 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


【解决方案1】:
  1. 对于每个数据表,动态生成一个POCO的通用列表 课程

但我不想硬编码任何实际的类。

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

--

根据我的理解编辑:

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

【讨论】:

  • 也许我解释得不对。假设我们在数据库中有两个名为“Person”和“Address”的表。我要做的是遍历所有这些类,并将数据对象类的类数据类型一一传递给泛型函数,让它填充该对象类型的泛型列表,然后返回列表。 POCO 类本质上类似于 EF 类,尽管它们实际上与 EF 无关。数据库中的每一个表列在POCO类中都有一个数据类型相同的属性。
  • @DigiOzMultimedia 哦,我现在明白了,我以为这些类还不存在,你想在运行时创建它们,这很复杂。我会根据我的理解编辑我的答案
  • 泰瑞斯做得很好!我唯一需要更改的是获取“类型”变量的方式,因为 Type.GetType 仅在类与执行代码位于同一程序集中时才有效。因为该类位于不同的程序集中,所以我不得不使用“Type type = Assembly.Load("[ASSEMBLY NAMESPACE").GetTypes().First(t => t.Name == tableName);”获取类型。从那里您的代码可以完美运行。非常感谢您的帮助!
【解决方案2】:

只需选择实体框架,而不是自己再发明一次。

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

【讨论】:

  • 这只是一个小问题。 EF 非常慢,并且不支持我试图支持其他项目的 SQL 中的 5000 多个表(对于这个只有 100 个,但我在其他地方使用它作为模板)。通过使用 ADO.NET,我设法将应用程序的速度提高了 100 倍,并根据需要支持尽可能多的数据库表。
猜你喜欢
  • 2011-04-12
  • 1970-01-01
  • 2021-11-26
  • 1970-01-01
  • 2016-03-17
  • 2018-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多