2012年4月19日星期四

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

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



类泛型的约束:

1 public static class ToModel<T> where T : class, new()

定义委托:

1 public delegate void SetString(string value);

创建委托方法:

1 private static SetString CreateStringDelegate(T model, string propertyName)2 {3    MethodInfo mi = model.GetType().GetProperty(propertyName).GetSetMethod();4    Type type = typeof(SetString);5    return Delegate.CreateDelegate(type, model, mi) as SetString;6  }

利用反射和委托将DataTable转换为实体集:

 1         public static IList<T> GetDelegate_ToModelList(DataTable dt) 2         { 3             IList<T> list = new List<T>(); 4             if (dt == null || dt.Rows.Count < 1) return list; 5             SetString setDelegateString; 6             foreach (DataRow dr in dt.Rows) 7             { 8                 T model = new T(); 9                 foreach (DataColumn dc in dt.Columns)10                 {11                     setDelegateString = CreateStringDelegate(model, dc.ColumnName);12                     setDelegateString(dr[dc.ColumnName].ToString());13                 }14                 list.Add(model);15             }16             return list;17         }

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

如果这样定义委托:

1 public delegate void SetString<PT>(PT value)

创建委托方法(这里有问题,不知如何处理):

1         private static SetString CreateStringDelegate(T model, string propertyName)2         {3             MethodInfo mi = model.GetType().GetProperty(propertyName).GetSetMethod();4             Type type = typeof(model).GetProperty(propertyName).PropertyType;5             return Delegate.CreateDelegate(type, model, mi) as SetString<type>;6         }

利用反射和委托将DataTable转换为实体集:

 1         public static IList<T> GetDelegate_ToModelList(DataTable dt) 2         { 3             IList<T> list = new List<T>(); 4             if (dt == null || dt.Rows.Count < 1) return list; 5             foreach (DataRow dr in dt.Rows) 6             { 7                 T model = new T(); 8                 foreach (DataColumn dc in dt.Columns) 9                 {10                     SetString<typeof(T).GetProperty(dc.ColumnName).PropertyType> setDelegateString = CreateStringDelegate(model, dc.ColumnName);11                     setDelegateString(dr[dc.ColumnName].ToString());12                 }13                 list.Add(model);14             }15             return list;16         }

一直疑惑着,希望有人帮我解决疑惑,直接反射的方法我也有,但是这个问题不解决,心里一直有疙瘩,希望有人帮帮忙,谢谢!



TAG: