转: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;
}
}
这样感觉是不是好很多呢?
- 转:SilverLight4 + WEB SERVICE 解决方案(三)
- 转:SilverLight4 + WEB SERVICE 解决方案(一)
- 转:SilverLight4 + WEB SERVICE 解决方案(二)
- Axis2 Web Service(三)
- Axis2 Web Service(三)
- 简单Web service 身份验证解决方案
- 简单Web service 身份验证解决方案
- 简单Web service 身份验证解决方案
- 简单Web service 身份验证解决方案
- 简单Web service 身份验证解决方案
- 简单Web service 身份验证解决方案
- cxf+web service(三)HelloWorld
- (转)JAVA 调用Web Service的三种方法
- Web Service 接口大量数据传输解决方案
- Web Service调用轻量级安全解决方案
- silverlight4+WCF RIA Service + IIS6 安装 部署步骤 Domain Service
- Silverlight4入门之Button控件(三)
- Web Service调用方式(全三)
- 转:SilverLight4 + WEB SERVICE 解决方案(一)
- UCS-2和UTF-8的互相转换
- ARM+Linux 架构嵌入式学习步骤
- 转:SilverLight4 + WEB SERVICE 解决方案(二)
- 算法运行时间、logN、NlogN 之间的比较
- 转:SilverLight4 + WEB SERVICE 解决方案(三)
- shell如何统计文本文件行数
- SAP 增强方式
- 小型软件团队该如何分工(转)
- 匿名内部类的多线程使用
- 计算机应用的热点之一
- 鱼翅加工,老板说的太有趣了
- “由于数据存储中不存在项目引用的设备平台,因此无法打开项目。”解决方法
- ASP.NET跨页面传值的几种方法 转http://www.cnblogs.com/kivenhou/archive/2010/03/02/1676773.html#1773015