예제 #1
0
        public MessageDescriptor <T> ReadDescriptor <T>(byte[] encodedDescriptor) where T : new()

        {
            var descrInfo = DescriptorInfo.GetDescriptor().Read(encodedDescriptor);

            var builder = MessageDescriptorBuilder.New <T>();

            foreach (var fieldParams in descrInfo.Fields)
            {
                switch (fieldParams.Type)
                {
                case "Boolean":
                    builder.Bool(fieldParams.Number,
                                 obj => Convert.ToBoolean(obj.GetType().GetField(fieldParams.Name)
                                                          .GetValue(obj)),
                                 (obj, val) => obj.GetType().GetField(fieldParams.Name)
                                 .SetValue(obj, val));
                    break;

                case "Double":
                    builder.Double(fieldParams.Number,
                                   obj => Convert.ToDouble(obj.GetType().GetField(fieldParams.Name)
                                                           .GetValue(obj)),
                                   (obj, val) => obj.GetType().GetField(fieldParams.Name)
                                   .SetValue(obj, val));
                    break;

                case "String":
                    builder.String(fieldParams.Number,
                                   obj => obj.GetType().GetField(fieldParams.Name)
                                   .GetValue(obj).ToString(),
                                   (obj, val) => obj.GetType().GetField(fieldParams.Name)
                                   .SetValue(obj, val));
                    break;

                case "Int32":
                    builder.Int32(fieldParams.Number,
                                  obj => Convert.ToInt32(obj.GetType().GetField(fieldParams.Name)
                                                         .GetValue(obj)),
                                  (obj, val) => obj.GetType().GetField(fieldParams.Name)
                                  .SetValue(obj, val));
                    break;
                }
            }

            return(builder.CreateDescriptor());
        }
예제 #2
0
        public byte[] WriteDescriptor <T>() where T : class
        {
            var innerFields = typeof(T).GetFields();

            var descrInfo = new DescriptorInfo
            {
                FieldsCount = innerFields.Length
            };

            for (int i = 0; i < descrInfo.FieldsCount; i++)
            {
                var field = innerFields[i];
                descrInfo.Fields.Add(new FieldParams
                {
                    Name   = field.Name,
                    Number = i + 1,
                    Type   = field.FieldType.Name
                });
            }

            return(DescriptorInfo.GetDescriptor().Write(descrInfo));
        }