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)));
        }