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

来源:互联网 发布:数据安全平台 编辑:程序博客网 时间:2024/05/21 06:22

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

 

 

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

原创粉丝点击