private IEnumerable <MapperPosition> CreateMemberEntries(IBuilderContext context) { return(Type.GetProperties() .Select(x => new { Property = x, Attribute = x.GetCustomAttributes().OfType <AbstractMemberMapAttribute>().FirstOrDefault(), ArrayAttribute = x.GetCustomAttribute <MapArrayAttribute>() }) .Where(x => x.Attribute != null) .Select(x => { var converterBuilder = CreateConverterBuilder(x.ArrayAttribute, x.Attribute); if (!converterBuilder.Match(x.Property.PropertyType)) { throw new ByteMapperException( "Attribute does not match property. " + $"type=[{x.Property.DeclaringType.FullName}], " + $"property=[{x.Property.Name}], " + $"attribute=[{typeof(MapArrayAttribute).FullName}]"); } var builder = new MemberMapperBuilder(converterBuilder) { Offset = x.Attribute.Offset, Property = x.Property }; return new MapperPosition(builder.Offset, builder.CalcSize(), builder.CreateMapper(context)); })); }
private ITypeConfigSyntax <T> ForMemberInternal(string name, int offset, Action <IMemberConfigSyntax> config) { if (offset < 0) { throw new ArgumentOutOfRangeException(nameof(offset)); } if (config is null) { throw new ArgumentNullException(nameof(config)); } var type = typeof(T); var pi = type.GetProperty(name); if (pi is null) { throw new ArgumentException("Name is invalid.", nameof(name)); } var member = new MemberConfigExpression(); config(member); if (member.Expression is null) { throw new InvalidOperationException("Property is not mapped."); } var converterBuilder = member.Expression.GetMapConverterBuilder(); if (!converterBuilder.Match(pi.PropertyType)) { throw new ByteMapperException( "Expression does not match property. " + $"type=[{pi.DeclaringType.FullName}], " + $"property=[{pi.Name}]"); } var builder = new MemberMapperBuilder(converterBuilder) { Property = pi, Offset = offset }; memberMapBuilders.Add(builder); lastOffset = Math.Max(offset, lastOffset) + builder.CalcSize(); return(this); }