利用泛型和反射实现IDataReader转实体

Posted 思明

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了利用泛型和反射实现IDataReader转实体相关的知识,希望对你有一定的参考价值。

public static T ReaderToModel<T>(IDataReader row)
        {
            // 1、使用与指定参数匹配最高的构造函数,来创建指定类型的实例
            Type modelType = typeof(HShopingCarModel);
            T model = Activator.CreateInstance<T>();
            for (int i = 0; i < row.FieldCount; i++)
            {
                // 2、判断字段值是否为空或不存在的值
                if (!(row[i] == null || row[i] is DBNull))
                {
                    // 3、匹配字段名
                    PropertyInfo pi = modelType.GetProperty(row.GetName(i), BindingFlags.GetProperty | BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase);
                    if (pi != null)
                    {
                        // 4、绑定实体对象中同名的字段 
                        pi.SetValue(model, CheckType(row[i], pi.PropertyType), null);
                    }
                }
            }

            return model;
        }

        /// <summary>
        /// 对可空类型进行判断转换(*要不然会报错)
        /// </summary>
        /// <param name="value">DataReader字段的值</param>
        /// <param name="conversionType">该字段的类型</param>
        /// <returns></returns>
        private static object CheckType(object value, Type conversionType)
        {
            if (conversionType.IsGenericType && conversionType.GetGenericTypeDefinition().Equals(typeof(Nullable<>)))
            {
                if (value == null)
                    return null;
                System.ComponentModel.NullableConverter nullableConverter = new System.ComponentModel.NullableConverter(conversionType);
                conversionType = nullableConverter.UnderlyingType;
            }
            return Convert.ChangeType(value, conversionType);
        }

 

以上是关于利用泛型和反射实现IDataReader转实体的主要内容,如果未能解决你的问题,请参考以下文章

用泛型和反射实现函数通用

编写高质量代码:改善Java程序的151个建议(第7章:泛型和反射___建议106~109)

把实体类转成xml让list的最外层标签失效

泛型和泛型集合

编写高质量代码:改善Java程序的151个建议(第7章:泛型和反射___建议98~101)

转 利用java反射实现两个具有相同属性bean赋值