GeneratedMessage.cs 3.0 KB

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