internal static void PopulateFromProperty(object objValue, PropertyInfo pi, ref ColumnInfo ci, out ColumnAttribute columnAttr) { //验证Table修饰符 var isExplicit = pi.DeclaringType.GetCustomAttributes(typeof(TableAttribute), true).Any(); var tableAttr = pi.DeclaringType.GetCustomAttributes(typeof(TableAttribute), true).FirstOrDefault() as TableAttribute; columnAttr = pi.GetCustomAttributes(typeof(ColumnAttribute), true).FirstOrDefault() as ColumnAttribute; var isIgnore = pi.GetCustomAttributes(typeof(IgnoreAttribute), true).Any(); if (isIgnore || (isExplicit && columnAttr == null)) { ci = null; } else if (objValue == null) { ci = null; } else { ci = ci ?? new ColumnInfo(); ci.ColumnName = columnAttr.NameAs; ci.ColumnType = columnAttr.ColumnTypeAs ?? pi.PropertyType; ci.IsClass = RefletUtil.IsClass(pi.PropertyType); ci.IsGenric = RefletUtil.IsListGeneric(pi.PropertyType); ci.IsBaseType = RefletUtil.IsBaseType(pi.PropertyType); ci.IsTableAs = string.IsNullOrEmpty(columnAttr.TableNameAs); ci.TableNameAs = string.IsNullOrEmpty(columnAttr.TableNameAs) ? tableAttr.TableName : columnAttr.TableNameAs; ci.DBType = columnAttr.DbTypeAs == TargetDbType.Oracle ? "ORACLE" : "SQLSERVER"; object colValue = new BuildColumn() { PropertyInfo = pi }.GetValue(objValue); if (colValue != null) { if (!columnAttr.HasExtendies) { ci.Value = Convert.ChangeType(colValue, ci.ColumnType); } else { MethodInfo method = pi.DeclaringType.GetMethod(columnAttr.FormatFuncName); ExtensionsResult extensions = (ExtensionsResult)method.Invoke(objValue, new object[] { colValue }); ci.Value = extensions.Value; ci.ColumnType = extensions.ValueType; } ci.IsNull = false; } else { ci.IsNull = true; } } }
public T ToEntity <T>(DataSet ds) where T : class, new() { T obj = new T(); if (ds == null) { return(obj); } else { IDataTableMapper mapper = new DefaultTableMapper(); if (RefletUtil.IsClass(typeof(T))) { PropertyInfo[] properties = mapper.GetAllProperty(obj.GetType()); foreach (var property in properties) { MapperInfo mi = mapper.GetMapperInfo(ds, property); if (RefletUtil.IsBaseType(property.PropertyType)) { object pvalue = mi.HasExtend.Key ? mi.HasExtend.Value.Invoke(obj, new object[] { property.Name, mi.SourceTb.Rows[0][mi.ColumnName] }) : mi.SourceTb.Rows[0][mi.ColumnName]; property.SetValue(obj, Convert.ChangeType(pvalue, property.PropertyType), null); } if (RefletUtil.IsClass(property.PropertyType)) { object subClassInstance = RefletUtil.CreateClassInstance(property.PropertyType); PropertyInfo[] SubClassProperties = mapper.GetAllProperty(property.PropertyType); foreach (var SubClassProperty in SubClassProperties) { MapperInfo subClassPropertyMi = mapper.GetMapperInfo(ds, SubClassProperty); if (RefletUtil.IsBaseType(SubClassProperty.PropertyType)) { object subclasspvalue = subClassPropertyMi.HasExtend.Key ? subClassPropertyMi.HasExtend.Value.Invoke(subClassInstance, new object[] { SubClassProperty.Name, subClassPropertyMi.SourceTb.Rows[0][subClassPropertyMi.ColumnName] }) : subClassPropertyMi.SourceTb.Rows[0][subClassPropertyMi.ColumnName]; SubClassProperty.SetValue(subClassInstance, Convert.ChangeType(subclasspvalue, SubClassProperty.PropertyType), null); } } property.SetValue(obj, Convert.ChangeType(subClassInstance, property.PropertyType), null); } if (RefletUtil.IsListGeneric(property.PropertyType)) { var instance = RefletUtil.CreateGenericInstance(property.PropertyType, out Type instancetype); var instancelList = RefletUtil.CreateGeneric(instancetype); //GenricListSetValue(ds, property.PropertyType, ref instancelList); #region V1.0 for (int i = 0; i < mi.SourceTb.Rows.Count; i++) { //List<Class> => Class.Class instance = RefletUtil.CreateGenericInstance(property.PropertyType, out _); PropertyInfo[] insproperties = mapper.GetAllProperty(instancetype); foreach (var item in insproperties) { MapperInfo itemMI = mapper.GetMapperInfo(ds, item); if (RefletUtil.IsBaseType(item.PropertyType)) { object itemprovalue = itemMI.HasExtend.Key ? itemMI.HasExtend.Value.Invoke(instance, new object[] { item.Name, itemMI.SourceTb.Rows[i][itemMI.ColumnName] }) : itemMI.SourceTb.Rows[i][itemMI.ColumnName]; item.SetValue(instance, Convert.ChangeType(itemprovalue, item.PropertyType), null); } if (RefletUtil.IsClass(item.PropertyType)) { object itemsubclassInstance = RefletUtil.CreateClassInstance(item.PropertyType); PropertyInfo[] itemsubclassproperties = mapper.GetAllProperty(item.PropertyType); foreach (var subitemproperty in itemsubclassproperties) { MapperInfo subitemproMI = mapper.GetMapperInfo(ds, subitemproperty); if (RefletUtil.IsBaseType(subitemproperty.PropertyType)) { object subitemproValue = subitemproMI.HasExtend.Key ? subitemproMI.HasExtend.Value.Invoke(itemsubclassInstance, new object[] { subitemproperty.Name, subitemproMI.SourceTb.Rows[i][subitemproMI.ColumnName] }) : subitemproMI.SourceTb.Rows[i][subitemproMI.ColumnName]; subitemproperty.SetValue(itemsubclassInstance, Convert.ChangeType(subitemproValue, subitemproperty.PropertyType), null); } } item.SetValue(instance, Convert.ChangeType(itemsubclassInstance, item.PropertyType), null); } } RefletUtil.AddObjToGeneric(instancelList, instance); } #endregion property.SetValue(obj, instancelList, null); } } } //List else { var instance = RefletUtil.CreateGenericInstance(typeof(T), out Type instancetype); var instancelList = RefletUtil.CreateGeneric(instancetype); GenricListSetValue(ds, typeof(T), ref instancelList); obj = (T)instancelList; } } return(obj); }
private void GenricListSetValue(DataSet ds, Type listype, ref object instancelList) { var instance = RefletUtil.CreateGenericInstance(listype, out Type instancetype); IDataTableMapper mapper = new DefaultTableMapper(); MapperInfo insMI = MapperInfo.FromType(ds, instancetype); for (int i = 0; i < insMI.SourceTb.Rows.Count; i++) { instance = RefletUtil.CreateGenericInstance(listype, out _); PropertyInfo[] properties = mapper.GetAllProperty(instancetype); foreach (var property in properties) { MapperInfo mi = mapper.GetMapperInfo(ds, property); if (RefletUtil.IsBaseType(property.PropertyType)) { object pvalue = mi.HasExtend.Key ? mi.HasExtend.Value.Invoke(instance, new object[] { property.Name, mi.SourceTb.Rows[0][mi.ColumnName] }) : mi.SourceTb.Rows[0][mi.ColumnName]; property.SetValue(instance, Convert.ChangeType(pvalue, property.PropertyType), null); } if (RefletUtil.IsClass(property.PropertyType)) { object subClassInstance = RefletUtil.CreateClassInstance(property.PropertyType); PropertyInfo[] SubClassProperties = mapper.GetAllProperty(property.PropertyType); foreach (var SubClassProperty in SubClassProperties) { MapperInfo subClassPropertyMi = mapper.GetMapperInfo(ds, SubClassProperty); if (RefletUtil.IsBaseType(SubClassProperty.PropertyType)) { object subclasspvalue = subClassPropertyMi.HasExtend.Key ? subClassPropertyMi.HasExtend.Value.Invoke(subClassInstance, new object[] { SubClassProperty.Name, subClassPropertyMi.SourceTb.Rows[0][subClassPropertyMi.ColumnName] }) : subClassPropertyMi.SourceTb.Rows[0][subClassPropertyMi.ColumnName]; SubClassProperty.SetValue(subClassInstance, Convert.ChangeType(subclasspvalue, SubClassProperty.PropertyType), null); } } property.SetValue(instance, Convert.ChangeType(subClassInstance, property.PropertyType), null); } if (RefletUtil.IsListGeneric(property.PropertyType)) { var instancesub = RefletUtil.CreateGenericInstance(property.PropertyType, out Type instancesubtype); var instancesublList = RefletUtil.CreateGeneric(instancesubtype); for (int l = 0; l < mi.SourceTb.Rows.Count; l++) { //Llst<Class> => Class.Class instancesub = RefletUtil.CreateGenericInstance(property.PropertyType, out _); PropertyInfo[] insproperties = mapper.GetAllProperty(instancesubtype); foreach (var item in insproperties) { MapperInfo itemMI = mapper.GetMapperInfo(ds, item); if (RefletUtil.IsBaseType(item.PropertyType)) { object itemprovalue = itemMI.HasExtend.Key ? itemMI.HasExtend.Value.Invoke(instancesub, new object[] { item.Name, itemMI.SourceTb.Rows[l][itemMI.ColumnName] }) : itemMI.SourceTb.Rows[l][itemMI.ColumnName]; item.SetValue(instancesub, Convert.ChangeType(itemprovalue, item.PropertyType), null); } if (RefletUtil.IsClass(item.PropertyType)) { object itemsubclassInstance = RefletUtil.CreateClassInstance(item.PropertyType); PropertyInfo[] itemsubclassproperties = mapper.GetAllProperty(item.PropertyType); foreach (var subitemproperty in itemsubclassproperties) { MapperInfo subitemproMI = mapper.GetMapperInfo(ds, subitemproperty); if (RefletUtil.IsBaseType(subitemproperty.PropertyType)) { object subitemproValue = subitemproMI.HasExtend.Key ? subitemproMI.HasExtend.Value.Invoke(itemsubclassInstance, new object[] { subitemproperty.Name, subitemproMI.SourceTb.Rows[l][subitemproMI.ColumnName] }) : subitemproMI.SourceTb.Rows[l][subitemproMI.ColumnName]; subitemproperty.SetValue(itemsubclassInstance, Convert.ChangeType(subitemproValue, subitemproperty.PropertyType), null); } } item.SetValue(instancesub, Convert.ChangeType(itemsubclassInstance, item.PropertyType), null); } } RefletUtil.AddObjToGeneric(instancesublList, instancesub); } property.SetValue(instance, instancesublList, null); } } RefletUtil.AddObjToGeneric(instancelList, instance); } }