
转自: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);
// 获取泛型类型参数数组
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 );
// 设置实体对象
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,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;
}
}
这样感觉是不是好很多呢?
总结以上是内存溢出为你收集整理的转:SilverLight4 + WEB SERVICE 解决方案(三)全部内容,希望文章能够帮你解决转:SilverLight4 + WEB SERVICE 解决方案(三)所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)