转:SilverLight4 + WEB SERVICE 解决方案(三)

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

 

 

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值