利用委托反射将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         }

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

原文地址:https://www.cnblogs.com/cmsdn/p/2457135.html