RepeatedEnumAccessor.cs 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using Google.ProtocolBuffers.Collections;
  5. using Google.ProtocolBuffers.Descriptors;
  6. namespace Google.ProtocolBuffers.FieldAccess {
  7. /// <summary>
  8. /// Accessor for a repeated enum field.
  9. /// </summary>
  10. internal sealed class RepeatedEnumAccessor : RepeatedPrimitiveAccessor {
  11. private readonly EnumDescriptor enumDescriptor;
  12. internal RepeatedEnumAccessor(FieldDescriptor field, string name, Type messageType, Type builderType)
  13. : base(name, messageType, builderType) {
  14. enumDescriptor = field.EnumType;
  15. }
  16. public override object GetValue(IMessage message) {
  17. List<EnumValueDescriptor> ret = new List<EnumValueDescriptor>();
  18. foreach (int rawValue in (IEnumerable) base.GetValue(message)) {
  19. ret.Add(enumDescriptor.FindValueByNumber(rawValue));
  20. }
  21. return Lists.AsReadOnly(ret);
  22. }
  23. public override object GetRepeatedValue(IMessage message, int index) {
  24. // Note: This relies on the fact that the CLR allows unboxing from an enum to
  25. // its underlying value
  26. int rawValue = (int) base.GetRepeatedValue(message, index);
  27. return enumDescriptor.FindValueByNumber(rawValue);
  28. }
  29. public override void AddRepeated(IBuilder builder, object value) {
  30. base.AddRepeated(builder, ((EnumValueDescriptor) value).Number);
  31. }
  32. public override void SetRepeated(IBuilder builder, int index, object value) {
  33. base.SetRepeated(builder, index, ((EnumValueDescriptor) value).Number);
  34. }
  35. }
  36. }