利用c#反射实现实体类生成以及数据获取与赋值

时间:2022-01-27 00:09:22

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

         }