C# DataTable与Model互转的示例代码

 更新时间:2020年12月04日 14:20:47   作者:李志强  
这篇文章主要介绍了C#DataTable与Model互转的示例代码,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下
/// <summary>
 /// 实体转换辅助类
 /// </summary>
 public class ModelConvertHelper<T> where T : new()
 {
  /// <summary>
  /// List泛型转换DataTable.
  /// </summary>
  public DataTable ListToDataTable<T>(List<T> items)
  {
   var tb = new DataTable(typeof(T).Name);

   PropertyInfo[] props = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance);

   foreach (PropertyInfo prop in props)
   {
    Type t = GetCoreType(prop.PropertyType);
    tb.Columns.Add(prop.Name, t);
   }

   foreach (T item in items)
   {
    var values = new object[props.Length];

    for (int i = 0; i < props.Length; i++)
    {
     values[i] = props[i].GetValue(item, null);
    }

    tb.Rows.Add(values);
   }

   return tb;
  }

  /// <summary>
  /// model转换DataTable
  /// </summary>
  /// <typeparam name="T"></typeparam>
  /// <param name="items"></param>
  /// <returns></returns>
  public DataTable ModelToDataTable<T>(T items)
  {
   var tb = new DataTable(typeof(T).Name);

   PropertyInfo[] props = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance);

   foreach (PropertyInfo prop in props)
   {
    Type t = GetCoreType(prop.PropertyType);
    tb.Columns.Add(prop.Name, t);
   }


   var values = new object[props.Length];

   for (int i = 0; i < props.Length; i++)
   {
    values[i] = props[i].GetValue(items, null);
   }

   tb.Rows.Add(values);


   return tb;
  }

  /// <summary>
  /// Determine of specified type is nullable
  /// </summary>
  public static bool IsNullable(Type t)
  {
   return !t.IsValueType || (t.IsGenericType && t.GetGenericTypeDefinition() == typeof(Nullable<>));
  }

  /// <summary>
  /// Return underlying type if type is Nullable otherwise return the type
  /// </summary>
  public static Type GetCoreType(Type t)
  {
   if (t != null && IsNullable(t))
   {
    if (!t.IsValueType)
    {
     return t;
    }
    else
    {
     return Nullable.GetUnderlyingType(t);
    }
   }
   else
   {
    return t;
   }
  }

  /// <summary>
  /// DataTable转换泛型List
  /// </summary>
  /// <param name="dt"></param>
  /// <returns></returns>
  public static List<T> DataTableToList(DataTable dt)
  {
   // 定义集合
   List<T> ts = new List<T>();

   // 获得此模型的类型
   Type type = typeof(T);
   string tempName = "";
   foreach (DataRow dr in dt.Rows)
   {
    T t = new T();
    // 获得此模型的公共属性
    PropertyInfo[] propertys = t.GetType().GetProperties();
    foreach (PropertyInfo pi in propertys)
    {
     tempName = pi.Name; // 检查DataTable是否包含此列

     if (dt.Columns.Contains(tempName))
     {
      // 判断此属性是否有Setter
      if (!pi.CanWrite) continue;

      object value = dr[tempName];
      if (value != DBNull.Value)
       pi.SetValue(t, value, null);
     }
    }
    ts.Add(t);
   }
   return ts;
  }


  public static T DataTableToModel(DataTable dt)
  {
   // 定义实体
   T t = new T();

   // 获得此模型的类型
   Type type = typeof(T);
   string tempName = "";

   foreach (DataRow dr in dt.Rows)
   {

    // 获得此模型的公共属性
    PropertyInfo[] propertys = t.GetType().GetProperties();
    foreach (PropertyInfo pi in propertys)
    {
     tempName = pi.Name; // 检查DataTable是否包含此列

     if (dt.Columns.Contains(tempName))
     {
      // 判断此属性是否有Setter
      if (!pi.CanWrite) continue;

      object value = dr[tempName];
      if (value != DBNull.Value)
       pi.SetValue(t, value, null);
     }
    }
    break;
   }
   return t;
  }
 }

以上就是C#DataTable与Model互转的示例代码的详细内容,更多关于C#DataTable与Model互转的资料请关注脚本之家其它相关文章!

相关文章

  • C# 实现绘制PDF嵌套表格案例详解

    C# 实现绘制PDF嵌套表格案例详解

    嵌套表格,顾名思义,就是在一张表格中的特定单元格中再插入一个或者多个表格,本文将为大家介绍C#绘制PDF嵌套表格的代码示例,需要的同学可以参考一下
    2021-11-11
  • C#实现目录跳转(TreeView和SplitContainer)的示例代码

    C#实现目录跳转(TreeView和SplitContainer)的示例代码

    本文主要介绍了C#实现目录跳转(TreeView和SplitContainer)的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • C#实现求一组数据众数的方法

    C#实现求一组数据众数的方法

    这篇文章主要介绍了C#实现求一组数据众数的方法,这里以浮点型数组为例分析了C#求众数的算法原理与实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-08-08
  • c#之关闭窗体的实现方法

    c#之关闭窗体的实现方法

    这篇文章主要介绍了c#之关闭窗体的实现方法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • C# 实现颜色的梯度渐变案例

    C# 实现颜色的梯度渐变案例

    这篇文章主要介绍了C# 实现颜色的梯度渐变案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • c# 代理模式

    c# 代理模式

    代理模式:为其他对象提供一种代理以控制其他对象的访问
    2012-10-10
  • C# 字符串与unicode互相转换实战案例

    C# 字符串与unicode互相转换实战案例

    这篇文章主要介绍了C# 字符串与unicode互相转换实战案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • winform去掉右上角关闭按钮的方法

    winform去掉右上角关闭按钮的方法

    这篇文章主要介绍了winform去掉右上角关闭按钮的方法,需要的朋友可以参考下
    2014-02-02
  • unity3D实现摄像机抖动特效

    unity3D实现摄像机抖动特效

    这篇文章主要为大家详细介绍了unity3D实现摄像机抖动特效,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-01-01
  • 详解C# Socket异步通信实例

    详解C# Socket异步通信实例

    本篇文章主要介绍了C# Socket异步通信,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-12-12

最新评论