SilverLight4 + WEB SERVICE 解决方案(三) .

8 篇文章 0 订阅
3 篇文章 0 订阅

转自: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; } }

 

 

这样感觉是不是好很多呢?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值