C#利用委托反射将DataTable转换为实体集
- 摘要:本文介绍C#利用委托反射将DataTable转换为实体集,并提供详细的示例代码供参考。
类泛型的约束:
定义委托:public static class ToModel<T> where T : class, new()
创建委托方法:public delegate void SetString( string value);
利用反射和委托将DataTable转换为实体集: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; }
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)
利用反射和委托将DataTable转换为实体集: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>; }
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