反射小应用之DataTable和List<T>互操作

在程序中,往往会遇到一些小情况,就是数据库取出来的时候为了方便直接将数据通过存储在DataSet或DataTable中,这样做的一个后果是在日后的的对数据进行”细“操作时,就发现它可能没有List<T>那么方便,而另外一些时候(比如使用SqlBulkCopy的时候)使用DataTable会比较方便。于是我们就会想写一个专门的它们之间的互操作来使我们在操作它们的时候变得不那么复杂。网上关于它们之间的互操作的解决方法蛮多。这里参考了下它们,结合自己实际应用,写了一个它们之间互操作的扩展类


public static class DataTableEntityInteroperate
{
/// <summary>
/// List<T> to DataTable
/// </summary>
/// <typeparam name="T">Entity</typeparam>
/// <param name="entities">Entities</param>
/// <returns>DataTable</returns>
internal static DataTable ToDataTable<T>(this List<T> entities) where T : class,new()
{
//IsNull return
if (null == entities || entities.Count == 0)
return null;
//Initial Columns
DataTable dt = new DataTable();
PropertyInfo[] pArray = typeof(T).GetProperties();
Array.ForEach<PropertyInfo>(pArray, p =>
{
dt.Columns.Add(p.Name);
});
//Initial Rows
DataRow dr = dt.NewRow();
entities.ForEach(t =>
{
int i = 0;
Array.ForEach<PropertyInfo>(pArray, p =>
{
if (dt.Columns.Contains(p.Name))
dr[i] = p.GetValue(t); //Assigned to each column
});
i++;
});
return dt;
}

/// <summary>
/// DataTable to Entities
/// </summary>
/// <typeparam name="T">Entity</typeparam>
/// <param name="dt">DataTable</param>
/// <returns>List<T</returns>
internal static List<T> ToEntities<T>(this DataTable dt)/*必须来在于数据库来自于文件可能存在问题*/ where T : class,new()
{
//IsNullable
if (null == dt || dt.Rows.Count == 0)
return null;
//Initial Entities
List<T> entities = new List<T>();
foreach (DataRow row in dt.Rows)
{
PropertyInfo[] pArray = typeof(T).GetProperties();
T entity = new T();
Array.ForEach<PropertyInfo>(pArray, p =>
{
p.SetValue(entity, row[p.Name], null);
});
entities.Add(entity);
}
return entities;
}
}

关乎ToEntities扩展方法的备注:这个方法适合的是DataTable是由数据库直接返回的情况。如果DataTable数据是由Xml文件直接反序列化而来。就要在初始化DataTable时候,对DaTable的列对应在数据实体中的类型进行指定。

反射小应用之DataTable和List<T>互操作,布布扣,bubuko.com

时间: 2024-10-21 15:24:49

反射小应用之DataTable和List<T>互操作的相关文章

java反射小例子

package com.txwsqk.reflect; public class Car { private String brand; private String color; private int maxspeed; public Car(){} public Car(String brand, String color, int maxspeed){ this.brand = brand; this.color = color; this.maxspeed = maxspeed; }

java反射小练习

package com.gmw; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; public class ReflectTest { void test(String name,String word){ System.out.println(name+"说"+word); } public ReflectTest(String name) { } pu

反射小知识 【方法篇】

reflect_method html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legen

反射小demo和动态代理

反射小DEMO xx.properties type=com.itheima.reflect.LoginServiceImpl func=eat paramType=java.lang.String package com.itheima.reflect; public class LoginServiceImpl implements LoginService { @Override public void say() { System.err.println("say无参数");

反射List&lt;M&gt; To DataTable|反射IList To DataTable|反射 DataTable To List&lt;M&gt;

将DataTable集合反射获取 List<M> /// <summary> /// 根据DataTable集合反射获取 List<M> /// </summary> /// <typeparam name="M">泛型实体</typeparam> /// <param name="dt">DataTable</param> /// <returns>实体集合

反射类属性生成DataTable

public class People //类名 { private static string name; //字段 private string sex;//字段 public string Sex //属性 { get { return sex; } set { sex = value; } } public static string Name //属性 { get { return People.name; } set { People.name = value; } } } clas

反射小案例(菜单的可配置化)

刚开始学反射时,只是知道反射可以获取一个类里的各种信息(字段,属性,方法.....)!前面也只是列举了一些反射的基本语法,下面就通过一个简单小案例体会反射的用法: 注:该案例通过控制台程序完成 反射的基本用法:http://www.cnblogs.com/fengxuehuanlin/p/5274607.html 用的的类库:   调用的主方法: 注:由于是在主方法中调用类库,所以要引用类库这个程序集 控制台程序部分: class Program { static void Main(strin

java反射小悟

**上午看了一会java反射和代理,然后去银行办了一张卡,这里记下一点小感悟. 场景:我们去银行办业务时候,柜台上会放置两个小盒子,一个用来输入密码,一个用来业务办完后对服务人员进行评价.现在假设,银行要增加其他功能,比如在办卡同时绑定支付宝,会给予用户一定优惠(这里只是假设,可能不合理,这里只是作为例子,各位看官不要纠结于这个业务是否合理).那么现在那个输入密码和评价的小匣子已经不能满足需求了,需要再增加小匣子才行.如果银行又增加了N个业务呢,是不是需要增加N个小匣子,显然不合理.那要怎么办呢

反射小工具

一.类的复制 copyProperties(Object sourceObject,Object targetObject); ps:时间不够了,这个很糙,很多情况都还没有考虑.下次有时间了再好好写一个 public void copyProperties(Object sourceObject,Object targetObject){ /* * 首先获取到传递过来的两个类的Class对象 */ Class sourceClass = sourceObject.getClass(); Clas