GeneratedMessage.cs 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. using System;
  2. using System.Collections.Generic;
  3. using Google.ProtocolBuffers.Descriptors;
  4. using Google.ProtocolBuffers.FieldAccess;
  5. namespace Google.ProtocolBuffers {
  6. /// <summary>
  7. /// All generated protocol message classes extend this class. It implements
  8. /// most of the IMessage and IBuilder interfaces using reflection. Users
  9. /// can ignore this class as an implementation detail.
  10. /// </summary>
  11. public abstract class GeneratedMessage<TMessage, TBuilder> : AbstractMessage, IMessage<TMessage>
  12. where TMessage : GeneratedMessage<TMessage, TBuilder> where TBuilder : IBuilder<TMessage> {
  13. private readonly UnknownFieldSet unknownFields = UnknownFieldSet.DefaultInstance;
  14. protected abstract FieldAccessorTable<TMessage, TBuilder> InternalFieldAccessors { get; }
  15. public override MessageDescriptor DescriptorForType {
  16. get { return InternalFieldAccessors.Descriptor; }
  17. }
  18. protected override IMessage DefaultInstanceForTypeImpl {
  19. get { return DefaultInstanceForType; }
  20. }
  21. protected override IBuilder CreateBuilderForTypeImpl() {
  22. return CreateBuilderForType();
  23. }
  24. public IMessage<TMessage> DefaultInstanceForType {
  25. get { throw new NotImplementedException(); }
  26. }
  27. public IBuilder<TMessage> CreateBuilderForType() {
  28. throw new NotImplementedException();
  29. }
  30. private IDictionary<FieldDescriptor, Object> GetMutableFieldMap() {
  31. var ret = new Dictionary<FieldDescriptor, object>();
  32. MessageDescriptor descriptor = DescriptorForType;
  33. foreach (FieldDescriptor field in descriptor.Fields) {
  34. IFieldAccessor<TMessage, TBuilder> accessor = InternalFieldAccessors[field];
  35. if ((field.IsRepeated && accessor.GetRepeatedCount(this) != 0)
  36. || accessor.Has(this)) {
  37. ret[field] = accessor[this];
  38. }
  39. }
  40. return ret;
  41. }
  42. public override IDictionary<FieldDescriptor, object> AllFields {
  43. // FIXME: Make it immutable
  44. get { return GetMutableFieldMap(); }
  45. }
  46. public override bool HasField(FieldDescriptor field) {
  47. return InternalFieldAccessors[field].Has(this);
  48. }
  49. public override int GetRepeatedFieldCount(FieldDescriptor field) {
  50. return InternalFieldAccessors[field].GetRepeatedCount(this);
  51. }
  52. public override object this[FieldDescriptor field, int index] {
  53. get { return InternalFieldAccessors[field][this, index]; }
  54. }
  55. public override object this[FieldDescriptor field] {
  56. get { return InternalFieldAccessors[field][this]; }
  57. }
  58. public override UnknownFieldSet UnknownFields {
  59. get { return unknownFields; }
  60. }
  61. }
  62. }