internal ConvertMember(MemberInfo member, ConverterBuilderAssistant assistant) { switch (member) { case PropertyInfo property: Type = property.PropertyType; break; case FieldInfo field: Type = field.FieldType; break; default: throw new NotImplementedException(); } Name = member.Name; Assistant = assistant; ConvertMemberAttributeArray = member.GetCustomAttributes <ConvertMemberAttribute>().DefaultIfEmpty(new ConvertMemberAttribute()).ToArray(); foreach (var attribute in ConvertMemberAttributeArray) { attribute.SetConvertMember(this); } if (Type.IsArray) { ConvertType = Type.GetElementType(); } else { ConvertType = Type; } ConvertType = ConvertType.IsEnum ? typeof(Int32) : ConvertType; ConvertType = ConvertMemberAttributeArray.Aggregate(ConvertType, (type, attribute) => attribute.OnGetConvertType(type)); Endian = ConvertMemberAttributeArray.Aggregate(Endian.Dynamic, (endian, attribute) => attribute.OnGetEndian(endian)); }
internal Expression CreateGetBytes(ParameterExpression obj, GeneratorContext context) { var value = Expression.PropertyOrField(obj, Name); var littleEndian = GetLittleEndian(context.LittleEndian); var bytes = CreateGetBytes(ConvertType, value, littleEndian); var bytesResult = ConvertMemberAttributeArray.Aggregate(bytes, (result, attribute) => attribute.OnCreateGetBytes(obj, context, result)); return(bytesResult); }
internal Expression CreateToObject(ParameterExpression bytes, ParameterExpression startIndex, GeneratorContext context) { var loopBreak = Expression.Label(); Func <Expression, Expression> loopController = (Expression block) => Expression.Loop(Expression.Break(loopBreak), loopBreak); loopController = ConvertMemberAttributeArray.Aggregate(loopController, (result, member) => member.OnGetLoopController(bytes, startIndex, context, result)); var littleEndian = GetLittleEndian(context.LittleEndian); var obj = CreateToObject(ConvertType, Type, bytes, startIndex, littleEndian, loopController); return(ConvertMemberAttributeArray.Aggregate(obj, (result, attribute) => attribute.OnCreateToObject(bytes, startIndex, context, result))); }