/// <summary> /// 从HTTP上下文的名称值对中装载数据到对象 /// <remarks> /// <para>需要将名称值对中的值(string类型)转型为对象属性的类型,当前对象属性的类型只支持:</para> /// <para>1.string</para> /// <para>2.值类型(基础值类型+GUID+Enum)</para> /// <para>3.可空值类型</para> /// <para>如果不是以上类型,则会抛出转型无效的异常</para> /// </remarks> /// </summary> /// <typeparam name="T">T必须是一个类,而且必须带有无参构造函数</typeparam> /// <param name="pDataes">数据集</param> /// <param name="pPropertyNameMapping">属性名映射</param> /// <param name="pInstance">T实例,如果实例为null则自动创建一个T实例</param> /// <returns></returns> public static T LoadFrom <T>(NameValueCollection pDataes, IPropertyNameMapping pPropertyNameMapping, T pInstance = null) where T : class, new() { //参数处理 if (pPropertyNameMapping == null) { throw new ArgumentNullException("pPropertyNameMapping"); } if (pDataes == null) { return(null); } // Type tType = typeof(T); if (pInstance == null) { pInstance = (T)Activator.CreateInstance(tType); } //获取需要进行数据赋值的属性设置器 foreach (string key in pDataes.Keys) { var propertyName = pPropertyNameMapping.GetPropertyNameBy(key); if (!string.IsNullOrEmpty(propertyName))//存在属性映射 { var propertyInfo = tType.GetProperty(propertyName); if (propertyInfo != null)//对象中存在指定名称的属性 { var setter = DynamicMethodFactory.CreatePropertySetter(propertyInfo); if (setter != null) //属性存在设置器 { var value = pDataes[key]; try { setter(pInstance, value.ChangeTypeTo(propertyInfo.PropertyType)); } catch (Exception ex) { string errorMessage = string.Format("DataLoader设置值失败,数据键名[{0}],值[{1}].内部错误:[{2}]", key, value, ex.Message); throw new ArgumentException(errorMessage, ex); } } } } } //返回值 return(pInstance); }
/// <summary> /// 从DataTable中装载数据到对象 /// </summary> /// <typeparam name="T">T必须是一个类,而且必须带有无参构造函数</typeparam> /// <param name="pDataes">数据集</param> /// <param name="pPropertyNameMapping">属性名映射</param> /// <returns>T数组</returns> public static T[] LoadFrom <T>(DataTable pDataes, IPropertyNameMapping pPropertyNameMapping) where T : class, new() { //参数处理 if (pPropertyNameMapping == null) { throw new ArgumentNullException("pPropertyNameMapping"); } if (pDataes == null) { return(null); } if (pDataes.Rows.Count <= 0) { return(new T[0]); } // Type tType = typeof(T); List <T> list = new List <T>(); Dictionary <string, SetValueDelegate> propertySetters = new Dictionary <string, SetValueDelegate>(); //获取需要进行数据赋值的属性设置器 foreach (DataColumn column in pDataes.Columns) { var columnName = column.ColumnName; var propertyName = pPropertyNameMapping.GetPropertyNameBy(columnName); if (!string.IsNullOrEmpty(propertyName)) { var propertyInfo = tType.GetProperty(columnName); if (propertyInfo != null) { var setter = DynamicMethodFactory.CreatePropertySetter(propertyInfo); if (setter != null) { propertySetters.Add(columnName, setter); } } } } //将数据从DataTable中装载到T中 foreach (DataRow dr in pDataes.Rows) { //创建实例 T t = (T)Activator.CreateInstance(tType); //给实例赋值 foreach (var item in propertySetters) { var setter = item.Value; try { if (dr[item.Key] != DBNull.Value) { setter(t, dr[item.Key]); } //else //{ // setter(t, null); //} } catch (Exception ex) { string errorMessage = string.Format("DataLoader设置值失败,数据列名[{0}],值[{1}].内部错误:[{2}]", item.Key, item.Value, ex.Message); throw new ArgumentException(errorMessage, ex); } } //将实例添加进结果集 list.Add(t); } //返回结果 return(list.ToArray()); }