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

时间:2017-07-29 02:22:22

标签: c# reflection datatable generic-list dynamic-binding

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

  1. 获取数据库中的表格列表。
  2. 遍历列表中的每个表,并将表中的所有记录选择到数据表中。
  3. 对于每个数据表,动态生成POCO类的通用列表
  4. 读取每个数据行并填充对象,然后将其添加到列表中。
  5. 我正在完成第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 });
    

2 个答案:

答案 0 :(得分:1)

  
      
  1. 对于每个数据表,动态生成POCO的通用列表   类
  2.         

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

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

-

根据我的理解编辑:

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

答案 1 :(得分:0)

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

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

相关问题