C#利用委托反射将DataTable转换为实体集

C#利用委托反射将DataTable转换为实体集

2012-04-19  来自:CNBLOGS  字体大小:【    
  • 摘要:本文介绍C#利用委托反射将DataTable转换为实体集,并提供详细的示例代码供参考。
类泛型的约束:
  
  
public static class ToModel<T> where T : class, new()
定义委托:
  
  
public delegate void SetString( string value);
创建委托方法:
  
  
private static SetString CreateStringDelegate(T model, string propertyName) { MethodInfo mi = model.GetType().GetProperty(propertyName).GetSetMethod(); Type type = typeof(SetString); return Delegate.CreateDelegate(type, model, mi) as SetString; }
利用反射和委托将DataTable转换为实体集:
  
  
public static IList<T> GetDelegate_ToModelList(DataTable dt) { IList<T> list = new List<T>(); if (dt == null || dt.Rows.Count < 1) return list; SetString setDelegateString; foreach (DataRow dr in dt.Rows) { T model = new T(); foreach (DataColumn dc in dt.Columns) { setDelegateString = CreateStringDelegate(model, dc.ColumnName); setDelegateString(dr[dc.ColumnName].ToString()); } list.Add(model); } return list; }

这样写问题就来了,因为委托定义的参数时string类型的,因为我们实体中可能有int或者DateTime类型的,这时就需要用上泛型委托了

如果这样定义委托:

  
  
public delegate void SetString<PT>(PT value)
创建委托方法(这里有问题,不知如何处理):
  
  
private static SetString CreateStringDelegate(T model, string propertyName) { MethodInfo mi = model.GetType().GetProperty(propertyName).GetSetMethod(); Type type = typeof(model).GetProperty(propertyName).PropertyType; return Delegate.CreateDelegate(type, model, mi) as SetString<type>; }
利用反射和委托将DataTable转换为实体集:
  
  
public static IList<T> GetDelegate_ToModelList(DataTable dt) { IList<T> list = new List<T>(); if (dt == null || dt.Rows.Count < 1) return list; foreach (DataRow dr in dt.Rows) { T model = new T(); foreach (DataColumn dc in dt.Columns) { SetString< typeof(T).GetProperty(dc.ColumnName).PropertyType> setDelegateString = CreateStringDelegate(model, dc.ColumnName); setDelegateString(dr[dc.ColumnName].ToString()); } list.Add(model); } return list; }
作者:cmsdn

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值