利用.net中的反射实现将DataTable转换为List集合、类实体模型

 1、将DataTable类型转换为指定类型的List集合

 /// <summary>
 /// 将DataTable类型转换成List类型
 /// </summary>
 /// <typeparam name="T">需要转换List集合的实体类型</typeparam>
 /// <param name="dt">转换为List集合的DataTable</param>
 /// <returns>转换后的list集合</returns>
 public static List<T> ConvertDataTableToList<T>(DataTable dt) where T : new()//泛型约束,用于可以实例化T对象
 {
     List<T> list = new List<T>();
     Type type = typeof(T);
     for (int i = 0; i < dt.Rows.Count; i++)
     {
         T t = new T();
         PropertyInfo[] properties = type.GetProperties();
         foreach (PropertyInfo item in properties)
         {

             if (item.CanWrite && dt.Columns.Contains(item.Name))
             {
                 object value = dt.Rows[i][item.Name];
                 if (value != DBNull.Value) // 检查是否为空值
                 {
                     item.SetValue(t, value);
                 }
             }
         }
         list.Add(t);
     }
     return list;
 }

上述代码中:List<T>

<T> 是一个泛型参数,它在这个方法中表示一个占位符,可以接受任意类型作为参数。通过使用泛型参数,可以使方法在不同的类型上具有通用性和灵活性。

在这个方法中,<T> 告诉编译器我们希望在方法调用时指定一个具体的类型,以替代泛型参数 T。这允许我们根据需要将不同的类型传递给这个方法,它们会被替换为 T,将 DataTable 转换为指定类型的 List

例如,如果我们要将一个名为 Person 的自定义类转换为 DataTable,我们可以这样调用方法:

DataTable dt = // 从数据库或其他地方获取DataTable

List<Person> list = ConvertDataTableToList<Person>(dt);

在这个例子中,<T> 被替换为 Person,使方法能够将 DataTable 转换为包含 Person 对象的 List。这样,我们可以在不同的场景下使用相同的转换方法,只需要根据需要传递不同的类型。

2、将DataTable类型转换为类实体模型

 /// <summary>
 /// 将单条数据转换成实体模型
 /// </summary>
 /// <typeparam name="T">需要转换的实体模型的类型</typeparam>
 /// <param name="dt">转换为List集合的DataTable</param>
 /// <returns>返回单条数据的实体模型</returns>
 public static T ConvertDataToModel<T>(DataTable dt) where T : new()//泛型约束,用于可以实例化T对象
 {
     T t = new T();
     Type type = typeof(T);
     PropertyInfo[] property = type.GetProperties();
     foreach (PropertyInfo item in property)
     {
         if (item.CanWrite && dt.Columns.Contains(item.Name))
         {
             if (dt.Rows[0][item.Name] != DBNull.Value) // 检查是否为空值
             {
                 item.SetValue(t, dt.Rows[0][item.Name]);
             }
         }
     }
     return t;
 }

上述代码用于将 DataTable 中的单条数据转换为特定实体类型的实体模型。与前面的方法类似,它使用泛型参数 <T> 表示一个占位符,可以接受任意类型作为参数。

这个方法的实现逻辑是遍历实体类型的属性,检查 DataTable 中是否包含相应的列,并将列的值赋给实体属性。

通过条件 if (dt.Rows[0][item.Name] != DBNull.Value) 来检查是否为空值,以避免将 null 赋给实体属性。这一步操作也可以避免在类型转换过程中出现DataTable中某字段数据为null而出现程序报错的情况。

使用示例:

DataTable dt = // 从数据库或其他地方获取DataTable

Person personEntity = ConvertDataToModel<Person >(dt);

Person 是你要转换的实体类型。这样,你就可以将 DataTable 中的单条数据转换为指定类型的实体模型。

至此,上述两种方法就可以实现将DataTable中的数据转换为指定实体类型的List集合或者指定的单类实体。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以回答你的问题。利用反射可以实现 DataTableList<T> 之间的转换。 首先,我们需要定义一个通用的方法,该方法可以将 List<T> 转换DataTable,也可以将 DataTable 转换List<T>。该方法的实现需要借助反射机制。 下面是将 List<T> 转换DataTable 的代码: ```csharp public static DataTable ConvertToDataTable<T>(List<T> list) { DataTable table = new DataTable(); PropertyInfo[] properties = typeof(T).GetProperties(); foreach (PropertyInfo property in properties) { table.Columns.Add(property.Name, property.PropertyType); } foreach (T item in list) { DataRow row = table.NewRow(); foreach (PropertyInfo property in properties) { row[property.Name] = property.GetValue(item, null); } table.Rows.Add(row); } return table; } ``` 上面的代码,我们首先使用反射机制获取型 T 的所有属性信息,然后使用这些属性信息创建 DataTable 的列。接着,我们遍历 List<T> 的每个元素,使用反射获取元素的属性值,并将这些属性值添加到 DataRow ,最后将 DataRow 添加到 DataTable 。 下面是将 DataTable 转换List<T> 的代码: ```csharp public static List<T> ConvertToList<T>(DataTable table) where T : new() { List<T> list = new List<T>(); PropertyInfo[] properties = typeof(T).GetProperties(); foreach (DataRow row in table.Rows) { T item = new T(); foreach (PropertyInfo property in properties) { if (table.Columns.Contains(property.Name)) { property.SetValue(item, row[property.Name], null); } } list.Add(item); } return list; } ``` 上面的代码,我们同样使用反射机制获取型 T 的所有属性信息,然后遍历 DataTable 的每个 DataRow,使用反射设置每个 DataRow 对应的属性值,并将 T 对象添加到 List<T> 。 希望这些代码可以帮助你解决问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值