public PacketSerializer(IValueSerializerProvider <TPacketWriter> ValueSerializerProvider)
        {
            var FieldGroups =
                (from prop in typeof(TPacket).GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance)
                 where prop.CanRead
                 let field = prop.GetCustomAttribute <FieldAttribute>()
                             where field != null
                             let option = new FieldOption(prop, field)
                                          let serializer = ValueSerializerProvider.GetValueSerializer(option) ?? throw new NotSupportedException($"找不到字段{option}的值序列化器")
                                                           group(serializer, option) by field.Channel ?? "" into g
                                                           select(channel: g.Key, fields: g.OrderBy(i => i.option.Order).ToArray())
                ).ToArray();

            var argPacket = Expression.Parameter(typeof(TPacket), "package");
            var argWriter = Expression.Parameter(typeof(TPacketWriter), "writer");

            FuncSerialize = Expression.Lambda <Action <TPacketWriter, TPacket> >(
                Expression.Block(
                    from grp in FieldGroups
                    from field in grp.fields
                    select
                    Expression.Call(
                        Expression.Constant(field.serializer),
                        field.serializer.GetType().GetMethod("Serialize"),
                        Expression.Property(argPacket, field.option.Property),
                        argWriter,
                        Expression.Constant(field.option, typeof(IFieldOption))
                        )
                    ),
                argWriter,
                argPacket
                ).Compile();
        }
Beispiel #2
0
 public ValueSerializerHolder(IValueSerializerProvider provider)
 {
     this.provider = provider;
 }
Beispiel #3
0
 public ValueSerializer(IValueSerializerProvider provider)
 {
     this.serializer = HagarGeneratedCodeHelper.UnwrapService(this, provider.GetValueSerializer <TField>());
 }