博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
利用c#反射实现实体类生成以及数据获取与赋值
阅读量:5304 次
发布时间:2019-06-14

本文共 1443 字,大约阅读时间需要 4 分钟。

转:

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

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;
         }

 

转载于:https://www.cnblogs.com/jackljf/p/4768615.html

你可能感兴趣的文章
dedecms讲解-arc.listview.class.php分析,列表页展示
查看>>
Extjs6 经典版 combo下拉框数据的使用及动态传参
查看>>
【NodeJS】http-server.cmd
查看>>
研磨JavaScript系列(五):奇妙的对象
查看>>
面试题2
查看>>
selenium+java iframe定位
查看>>
P2P综述
查看>>
第五章 如何使用Burp Target
查看>>
Sprint阶段测试评分总结
查看>>
sqlite3经常使用命令&amp;语法
查看>>
linux下编译openjdk8
查看>>
【python】--迭代器生成器装饰器
查看>>
Pow(x, n)
查看>>
安卓当中的线程和每秒刷一次
查看>>
每日一库:Modernizr.js,es5-shim.js,es5-safe.js
查看>>
ajax连接服务器框架
查看>>
wpf样式绑定 行为绑定 事件关联 路由事件实例
查看>>
利用maven管理项目之POM文件配置
查看>>
TCL:表格(xls)中写入数据
查看>>
Oracle事务
查看>>