转自:http://www.cnblogs.com/anncesky/articles/1778067.html
在上一篇中提到了,业务逻辑层中进行数据类型的转换,如果每一次调用都要手工进行一次
数据转换,这样效率就太低了,为了让它更像普通的三层构架,在这加上一些自己动的数据
类型转换:
/* *************************************
*
* Author:Annce
* Date:2010-7-14
*
************************************** */
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Reflection;
namespace WebServiceForSilverlight.Common
{
/// <summary>
/// 实体数据适配器异常类
/// </summary>
public class DataConvertException : Exception
{
public DataConvertException() { }
public DataConvertException( string msg)
{
_msg += msg;
}
private string _msg = " /n/nDataConvter实体数据适配器异常。/n/n " ;
public override string Message
{
get
{
return base .Message + _msg;
}
}
public override string ToString()
{
return base .ToString() + _msg;
}
}
/// <summary>
/// 实体数据适配器
/// </summary>
public abstract class DataConvter
{
/// <summary>
/// 把DataTable的中数据,匹配到实体泛型列表中。
/// 注意:在实体的中一定要有与DataTable各列列名相同的属性名。
/// </summary>
/// <param name="dt"> 源DataTable数据 </param>
/// <param name="o"> 返回的泛型列表对象数据 </param>
public static void TableToList(DataTable dt, object list)
{
Type t = list.GetType();
bool findFlag = true ;
if (t.IsGenericType)
{
// object oList = t.InvokeMember(null,
// BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.Instance |
// BindingFlags.CreateInstance, null, null, null);
// 获取泛型类型参数数组
Type[] tParamArray = t.GetGenericArguments();
if (tParamArray.Length != 1 )
{
throw new DataConvertException( " DataTable数据转为泛型列表:泛型的类型参数不是只有1个! " );
}
// 获取实体属性数组
PropertyInfo[] piArray = tParamArray[ 0 ].GetProperties();
for ( int i = 0 ; i < dt.Rows.Count; i ++ )
{
// 创建实体对象
object oChild = tParamArray[ 0 ].InvokeMember( null ,
BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.Instance |
BindingFlags.CreateInstance, null , null , null );
// 设置实体对象
foreach (DataColumn dcTemp in dt.Columns)
{
foreach (PropertyInfo piTemp in piArray)
{
if (dcTemp.ColumnName.ToLower() == piTemp.Name.ToLower())
{
piTemp.SetValue(oChild, dt.Rows[i].ItemArray[dcTemp.Ordinal], null );
findFlag = true ;
break ;
}
findFlag = false ;
}
if ( ! findFlag)
throw new DataConvertException( " DataTable数据转为泛型列表:在实体对象中没有找到与DataTable列名' " + dcTemp + " '对应的属性! " );
}
// 泛型列表添加实体对象
t.InvokeMember( " Add " , BindingFlags.DeclaredOnly |
BindingFlags.Public | BindingFlags.NonPublic |
BindingFlags.Instance | BindingFlags.InvokeMethod, null , list, new object [] { oChild });
}
}
else
{
throw new DataConvertException( " DataTable数据转为泛型列表:在传入的第二个参数必须为泛型列表 G<T> 对象! " );
}
}
/// <summary>
/// 把DataTable的第一行数据,匹配到实体中。
/// 注意:在实体的中一定要有与DataTable各列列名相同的属性名。
/// </summary>
/// <param name="dt"> 源DataTable数据 </param>
/// <param name="o"> 返回的实体对象数据 </param>
public static void TableToModel(DataTable dt, object o)
{
bool findFlag = true ;
if (dt.Rows.Count == 0 )
{
throw new DataConvertException( " DataTable数据转为实体:DataTable数据为0行! " );
}
Type t = o.GetType();
PropertyInfo[] piArray = t.GetProperties();
foreach (DataColumn dcTemp in dt.Columns)
{
foreach (PropertyInfo piTemp in piArray)
{
if (dcTemp.ColumnName.ToLower() == piTemp.Name.ToLower())
{
piTemp.SetValue(o, dt.Rows[ 0 ].ItemArray[dcTemp.Ordinal], null );
findFlag = true ;
break ;
}
findFlag = false ;
}
if ( ! findFlag)
throw new DataConvertException( " DataTable数据转为实体:在实体对象中没有找到与DataTable列名' " + dcTemp + " '对应的属性! " );
}
}
/// <summary>
/// 把DataRow数据,匹配到实体中。
/// 注意:在实体的中一定要有与DataRow各列列名相同的属性名。
/// </summary>
/// <param name="dt"> 源DataRow数据 </param>
/// <param name="o"> 返回的实体对象数据 </param>
public static void RowToModel(DataRow drSource, object o)
{
DataTable dt = drSource.Table.Clone();
DataRow dr = dt.NewRow();
dt.Rows.Add(dr);
for ( int i = 0 ; i < dt.Columns.Count; i ++ )
{
dr[i] = drSource.ItemArray[i];
}
TableToModel(dt, o);
}
}
}
那么在业务逻辑层中,就可以:
public class ABLL
{
public List < AModel > GetData()
{
DataTable dt = new ADAL().GetData();
List < AModel > list = new List < AModel > ();
DataConvter.TableToList(dt, list);
// AModel mTemp;
// foreach (DataRow dr in dt.Rows)
// {
// mTemp = new AModel();
// mTemp.id = (int)dr.ItemArray[0];
// mTemp.name = (string)dr.ItemArray[1];
// mTemp.sex = (bool)dr.ItemArray[2];
// list.Add(mTemp);
// }
return list;
}
}
这样感觉是不是好很多呢?