/// <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); } }
/// <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); }
public static string GetActualMemberName(this AdvanceMember av) { return(string.IsNullOrEmpty(av.SqlCustomAttritube.MapTo) ? av.Member.Name : av.SqlCustomAttritube.MapTo); }