Ejemplo n.º 1
0
        /// <summary>
        ///
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="poco">If Null Default Value Will Be Used For Members</param>
        /// <returns>A List Of Advance Members Of T</returns>
        public static List <AdvanceMember> GetAdvanceMembersForDynamic <T>(T poco = null) where T : class
        {
            if (poco == null)
            {
                throw new BadCodeException($"Can Get The Properties Of The Dynamic Type {typeof(T).FullName} Because No Properties Has Been Assigned to the object");
            }

            var list = new List <AdvanceMember>()
            {
            };


            var props = DynamicObjectHelper.GetProperties(poco as ExpandoObject);

            props.ForEach(delegate(KeyValuePair <string, object> pair)
            {
                var advance = new AdvanceMember
                {
                    Member = new DynamicMember()
                    {
                        Type = pair.Value.GetType(), Name = pair.Key, CanWrite = true, CanRead = true
                    },
                    Value = pair.Value,
                    SqlCustomAttritube = new SqlColumnAttritube(),
                    Validation         = new DataValidationAttritube(),
                };


                list.Add(advance);
            });

            return(list);
        }
        private static void SetPocoProperteyValue <T>(T poco, IDataReader reader, AdvanceMember p, TypeAccessor accessor, IJsonSerializer jsonSerializer = null, IXmlSerializer xmlSerializer = null, ICsvSerializer csvSerializer = null)
        {
            var isDynamic = (typeof(IDynamicMetaObjectProvider).IsAssignableFrom(typeof(T)));



            var value = reader.GetValue(reader.GetOrdinal(p.GetActualMemberName()));

            if (isDynamic)
            {
                DynamicObjectHelper.AddProperty(poco as ExpandoObject, p.GetActualMemberName(), value);
                return;
            }

            if (value.GetType().Name != p.Member.Type.Name && value.GetType() != typeof(DBNull))
            {
                var type = p.Member.Type;
                if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable <>))
                {
                    type = Nullable.GetUnderlyingType(type);
                }
                if (type == null)
                {
                    type = p.Member.Type;
                }


                if (p?.SqlCustomAttritube?.SerializableType != null && p?.SqlCustomAttritube?.SerializableType != SerializableType.NONE)
                {
                    switch (p.SqlCustomAttritube.SerializableType)
                    {
                    case SerializableType.XML:
                        value = xmlSerializer?.DeserializeFromString(value.ToString(), type);
                        break;

                    case SerializableType.JSON:
                        value = jsonSerializer?.DeserializeFromString(value.ToString(), type);
                        break;

                    case SerializableType.CSV:
                        value = csvSerializer?.DeserializeFromString(value.ToString(), type);
                        break;

                    case SerializableType.NONE:
                        value = !type.IsEnum ? Convert.ChangeType(value, type, null) : System.Enum.Parse(type, value.ToString(), true);
                        break;

                    default:
                        break;
                    }
                }
                else
                {
                    value = !type.IsEnum ? Convert.ChangeType(value, type, null) : System.Enum.Parse(type, value.ToString(), true);
                }
            }
            try
            {
                accessor[poco, p.Member.Name] = value is DBNull ? null : value;
            }
            catch (Exception error)
            {
                // this property may not be settable
                Console.WriteLine(error.Message);
            }
        }
Ejemplo n.º 3
0
        /// <summary>
        ///
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="poco">If Null Default Value Will Be Used For Members</param>
        /// <returns>A List Of Advance Members Of T</returns>
        public static List <AdvanceMember> GetAdvanceMembers <T>(T poco = null) where T : class
        {
            if (typeof(T) == typeof(ExpandoObject) || typeof(IDynamicMetaObjectProvider).IsAssignableFrom(typeof(T)))
            {
                return(GetAdvanceMembersForDynamic(poco));
            }
            if (poco == null)
            {
                poco = TypeExtension.New <T> .Instance();
            }
            var list = new List <AdvanceMember>()
            {
            };

            var accessor = TypeAccessor.Create(poco.GetType(), true); // Fastmember Handles Performance Don't Worries Of Multiple Calls Via Dictionary
            var type     = poco.GetType();

            // Add Support For Dynamic Objects
            // if (typeof(T) == typeof(ExpandoObject))
            // {
            //     if (realParameterValue == null)
            //     {
            //         throw new BadCodeException(
            //             $"Can Get The Properties Of The Type {type.FullName} Because No Properties Has Been Assigned");
            //     }
            //     else
            //     {
            //         var props = DynamicObjectHelper.GetProperties(realParameterValue as ExpandoObject);
            //         var member = TypeExtension.New<Member>.Instance();
            //     }
            // }

            lock (Lookup)
            {
                if (Lookup.ContainsKey(type.FullName))
                {
                    var result     = Lookup.First(pair => pair.Key == type.FullName).Value;
                    var clonedList = new List <AdvanceMember>()
                    {
                    };                                               // WE MUST CLONED OTHERWISE WE ARE SCREWING OUR SELVE OVER
                    foreach (var cv in result)
                    {
                        var av = new AdvanceMember()
                        {
                            Member = cv.Member
                                     // ,Value = GetMemberValue(cv.FastMember, poco, accessor)
                            ,
                            SqlCustomAttritube = cv.SqlCustomAttritube
                            ,
                            FastMember = cv.FastMember
                            ,
                            SqlTableAttritube = cv.SqlTableAttritube
                            ,
                            Validation = cv.Validation
                        };
                        av.Value = GetMemberValue(av.FastMember, poco, accessor);
                        clonedList.Add(av);
                    }
                    return(clonedList.ToList());
                }

                var properties = type.GetProperties(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static).ToList();

                var enumSql        = System.Enum.GetValues(typeof(SqlColumnAttritubeMembers)).Cast <SqlColumnAttritubeMembers>().ToList();           // Performance Reason Why This Is Upper Global
                var enumTableSql   = System.Enum.GetValues(typeof(SqlTableAttritubeMembers)).Cast <SqlTableAttritubeMembers>().ToList();             // Performance Reason Why This Is Upper Global
                var enumValidation = System.Enum.GetValues(typeof(DataValidationAttritubeMembers)).Cast <DataValidationAttritubeMembers>().ToList(); // Performance Reason Why This Is Upper Global

                accessor.GetMembers().ToList().ForEach(delegate(Member member)
                {
                    if (properties.Where(i => i.Name == member.Name).ToList().Count <= 0)
                    {
                        return;
                    }
                    var property = properties.First(info => info.Name == member.Name);
                    var advance  = new AdvanceMember
                    {
                        FastMember         = member,
                        Member             = new DynamicMember().MapToDynamicMember(member),
                        Value              = GetMemberValue(member, poco, accessor),
                        SqlCustomAttritube = new SqlColumnAttritube(),
                        Validation         = new DataValidationAttritube(),

                        // ValidationErrors = new List<string>() { }
                    };



                    var sqlAttributeList = property.CustomAttributes
                                           .Where(data => data.AttributeType == typeof(SqlColumnAttritube)).ToList();
                    var validationAttributeList = property.CustomAttributes
                                                  .Where(data => data.AttributeType == typeof(DataValidationAttritube)).ToList();

                    var tableAttribute = property.CustomAttributes.Where(data => data.AttributeType == typeof(SqlTableAttritube)).ToList();
                    if (!tableAttribute.IsNullOrEmpty())
                    {
                        enumTableSql.ForEach(delegate(SqlTableAttritubeMembers members)
                        {
                            var sqlAttribute = tableAttribute.First();
                            var validname    = $"{members}";
                            var customAttributeNamedArguments = tableAttribute.First()?.NamedArguments;
                            if (customAttributeNamedArguments != null && customAttributeNamedArguments.Any(arg1 => arg1.MemberName == $"{members}"))
                            {
                                var value = sqlAttribute?.NamedArguments.First(arg => arg.MemberName == validname).TypedValue.Value;
                                if (advance.SqlTableAttritube == null)
                                {
                                    advance.SqlTableAttritube = new SqlTableAttritube();                                    // I DON'T KNOW HOW I FEEL ABOUT THIS RIGHT HERE IS MY SWAG
                                }
                                switch (members)
                                {
                                case SqlTableAttritubeMembers.JoinType:
                                    var temp = value.ToEnum <SQLJoinType>();
                                    advance.SqlTableAttritube.JoinType = temp;
                                    break;

                                case SqlTableAttritubeMembers.TableName:
                                    advance.SqlTableAttritube.TableName = (string)value;
                                    break;

                                case SqlTableAttritubeMembers.XReferenceTable:
                                    advance.SqlTableAttritube.XReferenceTable = (Type)value;
                                    break;

                                default:
                                    throw new ArgumentOutOfRangeException(nameof(members), members, null);
                                }
                            }
                        });
                        //advance.SqlTableAttritube = new SqlTableAttritube();
                    }


                    if (sqlAttributeList.Any())
                    {
                        enumSql.ForEach(delegate(SqlColumnAttritubeMembers members)
                        {
                            var sqlAttribute = sqlAttributeList.First();
                            var validname    = $"{members}";
                            var customAttributeNamedArguments = sqlAttributeList.First()?.NamedArguments;
                            if (customAttributeNamedArguments != null &&
                                customAttributeNamedArguments.Any(arg1 => arg1.MemberName == $"{members}"))
                            {
                                var value = sqlAttribute?.NamedArguments.First(arg => arg.MemberName == validname)
                                            .TypedValue.Value;

                                switch (members)
                                {
                                case SqlColumnAttritubeMembers.SetMaxColumnSize:
                                    advance.SqlCustomAttritube.MaxColumnSize = (int)value;
                                    break;

                                case SqlColumnAttritubeMembers.SetAutoIncrementBy:
                                    advance.SqlCustomAttritube.AutoIncrementBy = (int)value;
                                    break;

                                case SqlColumnAttritubeMembers.SetStartIncrementAt:
                                    advance.SqlCustomAttritube.StartIncrementAt = (int)value;
                                    break;

                                case SqlColumnAttritubeMembers.SetUtcDateTime:
                                    advance.SqlCustomAttritube.UtcDateTime = (bool)value;
                                    break;

                                case SqlColumnAttritubeMembers.SetPrimaryKey:
                                    advance.SqlCustomAttritube.PrimaryKey = (bool)value;
                                    break;

                                case SqlColumnAttritubeMembers.SetNullable:
                                    advance.SqlCustomAttritube.Nullable = (bool)value;
                                    break;

                                case SqlColumnAttritubeMembers.SetApiId:
                                    advance.SqlCustomAttritube.ApiId = (bool)value;
                                    break;

                                case SqlColumnAttritubeMembers.SetSyncTime:
                                    advance.SqlCustomAttritube.SyncTime = (bool)value;
                                    break;

                                case SqlColumnAttritubeMembers.SetIgnore:
                                    advance.SqlCustomAttritube.Ignore = (bool)value;
                                    break;

                                case SqlColumnAttritubeMembers.MapTo:
                                    advance.SqlCustomAttritube.MapTo = (string)value;
                                    break;

                                case SqlColumnAttritubeMembers.DefaultValue:
                                    advance.SqlCustomAttritube.DefaultValue = value;
                                    break;

                                case SqlColumnAttritubeMembers.TSQLDefaultValue:
                                    advance.SqlCustomAttritube.TSQLDefaultValue = (string)value;
                                    break;

                                case SqlColumnAttritubeMembers.SetxRefTableType:
                                    advance.SqlCustomAttritube.xRefTableType = (Type)value;
                                    break;

                                case SqlColumnAttritubeMembers.xRefTableSchema:
                                    advance.SqlCustomAttritube.xRefTableSchema = (string)value;
                                    break;

                                case SqlColumnAttritubeMembers.xRefTableName:
                                    advance.SqlCustomAttritube.xRefTableName = (string)value;
                                    break;

                                case SqlColumnAttritubeMembers.xRefJoinOnColumn:
                                    advance.SqlCustomAttritube.xRefJoinOnColumn = (string)value;
                                    break;

                                case SqlColumnAttritubeMembers.SetxRefOnUpdateCascade:
                                    advance.SqlCustomAttritube.xRefOnUpdateCascade = (bool)value;
                                    break;

                                case SqlColumnAttritubeMembers.SetxRefOnDeleteCascade:
                                    advance.SqlCustomAttritube.xRefOnDeleteCascade = (bool)value;
                                    break;

                                case SqlColumnAttritubeMembers.MappingIds:
                                    var a = value as ICollection <System.Reflection.CustomAttributeTypedArgument>;
                                    var b = new List <string>()
                                    {
                                    };
                                    b.AddRange(a.Select(c => c.ToString().ReplaceFirstOccurrence("\"", string.Empty, StringComparison.Ordinal).ReplaceLastOccurrence("\"", string.Empty, StringComparison.Ordinal)));
                                    advance.SqlCustomAttritube.MappingIds = b.ToArray();
                                    break;

                                case SqlColumnAttritubeMembers.SerializableType:
                                    advance.SqlCustomAttritube.SerializableType = value.ToEnum <SerializableType>();
                                    break;

                                default:
                                    throw new ArgumentOutOfRangeException(nameof(members), members, null);
                                }
                            }
                        });
                    }

                    if (validationAttributeList.Any())
                    {
                        enumValidation.ForEach(delegate(DataValidationAttritubeMembers members)
                        {
                            var validationAttribute           = validationAttributeList.First();
                            var validname                     = $"{members}";
                            var customAttributeNamedArguments = validationAttributeList.First()?.NamedArguments;
                            if (customAttributeNamedArguments != null &&
                                customAttributeNamedArguments.Any(arg1 => arg1.MemberName == $"{members}"))
                            {
                                var value = validationAttribute?.NamedArguments.First(arg => arg.MemberName == validname)
                                            .TypedValue.Value;

                                switch (members)
                                {
                                case DataValidationAttritubeMembers.SetMaxLengthSize:
                                    advance.Validation.MaxLengthSize = (int)value;
                                    break;

                                case DataValidationAttritubeMembers.SetRequireValue:
                                    advance.Validation.RequireValue = (bool)value;
                                    break;

                                case DataValidationAttritubeMembers.SetDataType:
                                    advance.Validation.DataType = (DataType)value;
                                    break;

                                case DataValidationAttritubeMembers.SetCanContainNumbers:
                                    advance.Validation.CanContainNumbers = (bool)value;
                                    break;

                                case DataValidationAttritubeMembers.SetCanContainLetter:
                                    advance.Validation.CanContainLetter = (bool)value;
                                    break;

                                case DataValidationAttritubeMembers.SetIgnore:
                                    advance.Validation.Ignore = (bool)value;
                                    break;

                                default:
                                    throw new ArgumentOutOfRangeException(nameof(members), members, null);
                                }
                            }
                        });
                    }

                    list.Add(advance);
                });

                Lookup.Add(type.FullName, list);
            }

            return(list);
        }
Ejemplo n.º 4
0
 public static string GetActualMemberName(this AdvanceMember av)
 {
     return(string.IsNullOrEmpty(av.SqlCustomAttritube.MapTo) ? av.Member.Name : av.SqlCustomAttritube.MapTo);
 }