posts - 648,comments - 3,views - 20万

转:http://hi.baidu.com/xyd21c/item/391da2fc8fb351c10dd1c8b8

原有的实体类成员逐个赋值与获取的方法弊端:

1、每次对实体类属性进行赋值时,都要检查reader的值是否为DBNull,出现了很多重复代码

2、每次对实体类属性进行赋值时,都要进行类型转换, 而实体类属性的类型是已知的,是不是可以自动完成这样的转换?

3、每次对实体类属性进行赋值时,都要进行实体类属性与数据库字段的对应。如果我们在设计数据库与实体类时,保证数据库字段与实体类属性采用同样的名称,那利用反射,我们可以通过代码自动进行属性与字段的对应。即使数据库字段与属性不同名,我们也可以通过更改查询语句,来做到这一点。

改进后的方法:

private void ReaderToObject(IDataReader reader, object targetObj)
         {
             for (int i = 0; i < 5; i++)
             {
                 System.Reflection.PropertyInfo propertyInfo = targetObj.GetType().GetProperty(reader.GetName(i));
                 if (propertyInfo != null)
                 {
                     if (reader.GetValue(i) != DBNull.Value)
                     {
                         if (propertyInfo.PropertyType.IsEnum)
                         {
                             propertyInfo.SetValue(targetObj, Enum.ToObject(propertyInfo.PropertyType, reader.GetValue(i)), null);
                         }
                         else
                         {
                             propertyInfo.SetValue(targetObj, reader.GetValue(i), null);
                         }
                     }
                 }
             }
         }
     }

来源链接

更完善的方法:

public static IList<T> FillList<T>(System.Data.IDataReader reader)
         {
             IList<T> lst = new List<T>();
             while (reader.Read())
             {
                 T RowInstance = Activator.CreateInstance<T>();
                 foreach (PropertyInfo Property in typeof(T).GetProperties())
                 {
                     foreach (BindingFieldAttribute FieldAttr in Property.GetCustomAttributes(typeof(BindingFieldAttribute), true))
                     {
                         try
                         {
                             int Ordinal = reader.GetOrdinal(FieldAttr.FieldName);
                             if (reader.GetValue(Ordinal) != DBNull.Value)
                             {
                                 Property.SetValue(RowInstance, Convert.ChangeType(reader.GetValue(Ordinal), Property.PropertyType), null);
                             }
                         }
                         catch
                         {
                             break;
                         }
                     }
                 }
                 lst.Add(RowInstance);
             }
             return lst;
         }

 

posted on   jackljf  阅读(5281)  评论(1编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示