• C# DataTable转换为List


    最近工作做经常需要将datatable转换成List,如果通过foreach循环datatable.Rows转换效率很低下也很枯燥,于是写了个通过反射自动转换的代码,大大提高了效率

     1 public static List<T> DataTableToList<T>(DataTable dt)
     2 {
     3      List<T> list = new List<T>();
     4      foreach (DataRow row in dt.Rows)
     5    {
     6      T model = Activator.CreateInstance<T>();
     7      Type typeinfo = typeof(T);
     8       foreach (var prop in typeinfo.GetProperties())
     9       {
    10         if (dt.Columns.Contains(prop.Name))
    11         {
    12           var o = To(row[prop.Name], prop.PropertyType);
    13           prop.SetValue(model, o, null);
    14         }
    15       }
    16      list.Add(model);
    17    }
    18    return list;
    19 }
    20 
    21 
    22 /// <summary>
    23 /// 将一个值转换成目标类型。
    24 /// </summary>
    25 public static object To(object value, Type destinationType)
    26 {
    27    return To(value, destinationType, CultureInfo.InvariantCulture);
    28 }
    29 
    30 /// <summary>
    31 /// 将一个值转换成目标类型.
    32 /// </summary>
    33 public static object To(object value, Type destinationType, CultureInfo culture)
    34 {
    35     if (value != null)
    36    {
    37     var sourceType = value.GetType();
    38 
    39     var destinationConverter = TypeDescriptor.GetConverter(destinationType);
    40     if (destinationConverter != null && destinationConverter.CanConvertFrom(value.GetType()))
    41     return destinationConverter.ConvertFrom(null, culture, value);
    42 
    43     var sourceConverter = TypeDescriptor.GetConverter(sourceType);
    44     if (sourceConverter != null && sourceConverter.CanConvertTo(destinationType))
    45     return sourceConverter.ConvertTo(null, culture, value, destinationType);
    46 
    47     if (destinationType.IsEnum && value is int)
    48     return Enum.ToObject(destinationType, (int)value);
    49 
    50     if (!destinationType.IsInstanceOfType(value))
    51     return Convert.ChangeType(value, destinationType, culture);
    52    }
    53    return value;
    54 }
  • 相关阅读:
    [a0004] <创作> 随笔视图索引
    [a0003] <创作> 全局视图索引
    git提交时忽略指定文件
    解决:gradle 前言中不允许有内容
    【LINQ标准查询操作符总结】之聚合操符
    RxJS 中的创建操作符
    项目管理(1) 什么是项目?
    数据库表数据统计及数据表的数据大小统计SQL
    C# 中一些类关系的判定方法
    Windows Azure NotificationHub+Firebase Cloud Message 实现消息推动(付源码)
  • 原文地址:https://www.cnblogs.com/xiaoxiuyuan/p/9050205.html
Copyright © 2020-2023  润新知