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