GeneratedMessage.cs 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  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, IMessage<TMessage>
  15. where TMessage : GeneratedMessage<TMessage, TBuilder>
  16. where TBuilder : IBuilder<TMessage> {
  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. protected override IMessage DefaultInstanceForTypeImpl {
  26. get { return DefaultInstanceForType; }
  27. }
  28. protected override IBuilder CreateBuilderForTypeImpl() {
  29. return CreateBuilderForType();
  30. }
  31. public abstract TMessage DefaultInstanceForType { get; }
  32. public abstract IBuilder<TMessage> CreateBuilderForType();
  33. internal IDictionary<FieldDescriptor, Object> GetMutableFieldMap() {
  34. // Use a SortedList so we'll end up serializing fields in order
  35. var ret = new SortedList<FieldDescriptor, object>();
  36. MessageDescriptor descriptor = DescriptorForType;
  37. foreach (FieldDescriptor field in descriptor.Fields) {
  38. IFieldAccessor accessor = InternalFieldAccessors[field];
  39. if ((field.IsRepeated && accessor.GetRepeatedCount(this) != 0)
  40. || accessor.Has(this)) {
  41. ret[field] = accessor.GetValue(this);
  42. }
  43. }
  44. return ret;
  45. }
  46. public override IDictionary<FieldDescriptor, object> AllFields {
  47. get { return Dictionaries.AsReadOnly(GetMutableFieldMap()); }
  48. }
  49. public override bool HasField(FieldDescriptor field) {
  50. return InternalFieldAccessors[field].Has(this);
  51. }
  52. public override int GetRepeatedFieldCount(FieldDescriptor field) {
  53. return InternalFieldAccessors[field].GetRepeatedCount(this);
  54. }
  55. public override object this[FieldDescriptor field, int index] {
  56. get { return InternalFieldAccessors[field].GetRepeatedValue(this, index); }
  57. }
  58. public override object this[FieldDescriptor field] {
  59. get { return InternalFieldAccessors[field].GetValue(this); }
  60. }
  61. public override UnknownFieldSet UnknownFields {
  62. get { return unknownFields; }
  63. }
  64. /// <summary>
  65. /// Replaces the set of unknown fields for this message. This should
  66. /// only be used before a message is built, by the builder. (In the
  67. /// Java code it is private, but the builder is nested so has access
  68. /// to it.)
  69. /// </summary>
  70. internal void SetUnknownFields(UnknownFieldSet fieldSet) {
  71. unknownFields = fieldSet;
  72. }
  73. }
  74. }