利用委托反射将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 }
一直疑惑着,希望有人帮我解决疑惑,直接反射的方法我也有,但是这个问题不解决,心里一直有疙瘩,希望有人帮帮忙,谢谢!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!