SingleEnumAccessor.cs 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839
  1. using System;
  2. using System.Collections.Generic;
  3. using Google.ProtocolBuffers.Descriptors;
  4. namespace Google.ProtocolBuffers.FieldAccess {
  5. /// <summary>
  6. /// Accessor for fields representing a non-repeated enum value.
  7. /// </summary>
  8. internal sealed class SingleEnumAccessor : SinglePrimitiveAccessor {
  9. private readonly EnumDescriptor enumDescriptor;
  10. internal SingleEnumAccessor(FieldDescriptor field, string name, Type messageType, Type builderType)
  11. : base(name, messageType, builderType) {
  12. enumDescriptor = field.EnumType;
  13. }
  14. /// <summary>
  15. /// Returns an EnumValueDescriptor representing the value in the builder.
  16. /// Note that if an enum has multiple values for the same number, the descriptor
  17. /// for the first value with that number will be returned.
  18. /// </summary>
  19. public override object GetValue(IMessage message) {
  20. // Note: This relies on the fact that the CLR allows unboxing from an enum to
  21. // its underlying value
  22. int rawValue = (int) base.GetValue(message);
  23. return enumDescriptor.FindValueByNumber(rawValue);
  24. }
  25. /// <summary>
  26. /// Sets the value as an enum (via an int) in the builder,
  27. /// from an EnumValueDescriptor parameter.
  28. /// </summary>
  29. public override void SetValue(IBuilder builder, object value) {
  30. EnumValueDescriptor valueDescriptor = (EnumValueDescriptor) value;
  31. base.SetValue(builder, valueDescriptor.Number);
  32. }
  33. }
  34. }