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;
                }
            }
        }
Exemple #2
0
        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);
        }
Exemple #3
0
        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);
            }
        }