GeneratedMessage.cs 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.IO;
  5. using Google.ProtocolBuffers.Collections;
  6. using Google.ProtocolBuffers.Descriptors;
  7. using Google.ProtocolBuffers.FieldAccess;
  8. namespace Google.ProtocolBuffers {
  9. /// <summary>
  10. /// All generated protocol message classes extend this class. It implements
  11. /// most of the IMessage interface using reflection. Users
  12. /// can ignore this class as an implementation detail.
  13. /// </summary>
  14. public abstract class GeneratedMessage<TMessage, TBuilder> : AbstractMessage<TMessage, TBuilder>
  15. where TMessage : GeneratedMessage<TMessage, TBuilder>
  16. where TBuilder : GeneratedBuilder<TMessage, TBuilder> {
  17. private UnknownFieldSet unknownFields = UnknownFieldSet.DefaultInstance;
  18. internal FieldAccessorTable FieldAccesseorsFromBuilder {
  19. get { return InternalFieldAccessors; }
  20. }
  21. protected abstract FieldAccessorTable InternalFieldAccessors { get; }
  22. public override MessageDescriptor DescriptorForType {
  23. get { return InternalFieldAccessors.Descriptor; }
  24. }
  25. internal IDictionary<FieldDescriptor, Object> GetMutableFieldMap() {
  26. // Use a SortedList so we'll end up serializing fields in order
  27. var ret = new SortedList<FieldDescriptor, object>();
  28. MessageDescriptor descriptor = DescriptorForType;
  29. foreach (FieldDescriptor field in descriptor.Fields) {
  30. IFieldAccessor accessor = InternalFieldAccessors[field];
  31. if (field.IsRepeated) {
  32. if (accessor.GetRepeatedCount(this) != 0) {
  33. ret[field] = accessor.GetValue(this);
  34. }
  35. } else if (HasField(field)) {
  36. ret[field] = accessor.GetValue(this);
  37. }
  38. }
  39. return ret;
  40. }
  41. public override IDictionary<FieldDescriptor, object> AllFields {
  42. get { return Dictionaries.AsReadOnly(GetMutableFieldMap()); }
  43. }
  44. public override bool HasField(FieldDescriptor field) {
  45. return InternalFieldAccessors[field].Has(this);
  46. }
  47. public override int GetRepeatedFieldCount(FieldDescriptor field) {
  48. return InternalFieldAccessors[field].GetRepeatedCount(this);
  49. }
  50. public override object this[FieldDescriptor field, int index] {
  51. get { return InternalFieldAccessors[field].GetRepeatedValue(this, index); }
  52. }
  53. public override object this[FieldDescriptor field] {
  54. get { return InternalFieldAccessors[field].GetValue(this); }
  55. }
  56. public override UnknownFieldSet UnknownFields {
  57. get { return unknownFields; }
  58. }
  59. /// <summary>
  60. /// Replaces the set of unknown fields for this message. This should
  61. /// only be used before a message is built, by the builder. (In the
  62. /// Java code it is private, but the builder is nested so has access
  63. /// to it.)
  64. /// </summary>
  65. internal void SetUnknownFields(UnknownFieldSet fieldSet) {
  66. unknownFields = fieldSet;
  67. }
  68. }
  69. }