C#实现DataTable映射成Model的方法(附源码)
本文实例讲述了C#实现DataTable映射成Model的方法。分享给大家供大家参考,具体如下:
这是数据库开发中经常遇到的问题,当然,这可以用现成的ORM框架来解决,但有些时候,如果DataSet/DataTable是第三方接口返回的,ORM就不方便了,还得自己处理。
反射自然必不可少的,另外考虑到DataTable中的ColumnName通常与Model的PropertyName并不严格对应,可以用Attribute来记录这种映射关系。
步骤1:先创建一个DataFieldAttribute类
usingSystem;
namespaceJimmy.ORM
{
[AttributeUsage(AttributeTargets.Property)]
publicsealedclassDataFieldAttribute:Attribute
{
///<summary>
///表对应的字段名
///</summary>
publicstringColumnName{set;get;}
publicDataFieldAttribute(stringcolumnName)
{
ColumnName=columnName;
}
}
}
步骤2:在Model/Entity的Class成员上,应用DataField特性,参见下面的代码:
usingSystem;
namespaceJimmy.ORM.Entity
{
[Serializable]
publicclassProductEntity:DataEntityBase
{
[DataField("PRODUCT_NO")]
publicstringProductNo{set;get;}
[DataField("PRODUCT_ID")]
publicintProductId{set;get;}
[DataField("PRODUCT_NAME")]
publicstringProductName{set;get;}
publicoverridestringToString()
{
returnstring.Format("ProductNo:{1}{0}ProductId:{2}{0}ProductName:{3}",Environment.NewLine,ProductNo,
ProductId,ProductName);
}
}
}
步骤3:该反射出场了,为了方便起见,封装了一个DataConvert类
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Data;
usingSystem.Reflection;
namespaceJimmy.ORM
{
///<summary>
///将DataRow/DataTable转换成Entity/Entity列表
///</summary>
publicstaticclassDataConvert<T>whereT:DataEntityBase,new()
{
///<summary>
///将DataRow行转换成Entity
///</summary>
///<paramname="dr"></param>
///<returns></returns>
publicstaticTToEntity(DataRowdr)
{
Tentity=newT();
Typeinfo=typeof(T);
varmembers=info.GetMembers();
foreach(varmiinmembers)
{
if(mi.MemberType==MemberTypes.Property)
{
//读取属性上的DataField特性
object[]attributes=mi.GetCustomAttributes(typeof(DataFieldAttribute),true);
foreach(varattrinattributes)
{
vardataFieldAttr=attrasDataFieldAttribute;
if(dataFieldAttr!=null)
{
varpropInfo=info.GetProperty(mi.Name);
if(dr.Table.Columns.Contains(dataFieldAttr.ColumnName))
{
//根据ColumnName,将dr中的相对字段赋值给Entity属性
propInfo.SetValue(entity,
Convert.ChangeType(dr[dataFieldAttr.ColumnName],propInfo.PropertyType),
null);
}
}
}
}
}
returnentity;
}
///<summary>
///将DataTable转换成Entity列表
///</summary>
///<paramname="dt"></param>
///<returns></returns>
publicstaticList<T>ToList(DataTabledt)
{
List<T>list=newList<T>(dt.Rows.Count);
foreach(DataRowdrindt.Rows)
{
list.Add(ToEntity(dr));
}
returnlist;
}
}
}
步骤4:测试
usingSystem;
usingSystem.Data;
usingJimmy.ORM.Entity;
namespaceJimmy.ORM.Test
{
classProgram
{
staticvoidMain()
{
DataTabledt=newDataTable();
dt.Columns.Add("PRODUCT_NO");
dt.Columns.Add("PRODUCT_ID");
dt.Columns.Add("PRODUCT_NAME");
dt.Rows.Add("00001",1,"手机");
dt.Rows.Add("00002",2,"服装");
varproducts=DataConvert<ProductEntity>.ToList(dt);
foreach(varentityinproducts)
{
Console.WriteLine(entity);
}
Console.Read();
}
}
}
完整实例代码代码点击此处本站下载。
希望本文所述对大家C#程序设计有所帮助。