zoukankan      html  css  js  c++  java
  • 利用c#反射实现实体类生成以及数据获取与赋值

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

  • 相关阅读:
    JavaWeb servlet过滤器
    JavaWeb--jsp九大内置对象完整总结
    response.getWriter()和jsp中的out对象的区别
    JavaWeb基础(jsp初识)
    Oracle 存储过程的基本语法 及注意事项
    PLSQL编程基础 :分支、循环语句
    oracle数据库的高级查询方法 多表联合查询
    oracle中 SQL语句 经典练习题
    git 拉取远程分支报错(fatal: '' is not a commit and a branch '' cannot be created from it)
    根据端口号查询进程并杀掉被占用的进程
  • 原文地址:https://www.cnblogs.com/jackljf/p/4768615.html
Copyright © 2011-2022 走看看