Пример #1
0
 /// <summary>
 /// Clears the value of the specified extension
 /// </summary>
 public static void Clear <TTarget, TValue>(ref ExtensionSet <TTarget> set, RepeatedExtension <TTarget, TValue> extension) where TTarget : IExtendableMessage <TTarget>
 {
     if (set == null)
     {
         return;
     }
     set.ValuesByNumber.Remove(extension.FieldNumber);
     if (set.ValuesByNumber.Count == 0)
     {
         set = null;
     }
 }
Пример #2
0
        public void GetRepeated()
        {
            var extensionValue = new TestAllTypes.Types.NestedMessage()
            {
                Bb = 42
            };
            var untypedExtension    = new Extension <TestAllExtensions, IList>(RepeatedNestedMessageExtension.FieldNumber, codec: null);
            var wrongTypedExtension = new RepeatedExtension <TestAllExtensions, TestAllTypes>(RepeatedNestedMessageExtension.FieldNumber, codec: null);

            var message = new TestAllExtensions();

            var value1 = message.GetExtension(untypedExtension);

            Assert.IsNull(value1);

            var repeatedField = message.GetOrInitializeExtension <TestAllTypes.Types.NestedMessage>(RepeatedNestedMessageExtension);

            repeatedField.Add(extensionValue);

            var value2 = message.GetExtension(untypedExtension);

            Assert.IsNotNull(value2);
            Assert.AreEqual(1, value2.Count);

            var valueBytes  = ((IMessage)value2[0]).ToByteArray();
            var parsedValue = TestProtos.Proto2.TestAllTypes.Types.NestedMessage.Parser.ParseFrom(valueBytes);

            Assert.AreEqual(extensionValue, parsedValue);

            var ex = Assert.Throws <InvalidOperationException>(() => message.GetExtension(wrongTypedExtension));

            var expectedMessage = "The stored extension value has a type of 'Google.Protobuf.TestProtos.Proto2.TestAllTypes+Types+NestedMessage, Google.Protobuf.Test.TestProtos, Version=1.0.0.0, Culture=neutral, PublicKeyToken=a7d26565bac4d604'. " +
                                  "This a different from the requested type of 'Google.Protobuf.TestProtos.Proto2.TestAllTypes, Google.Protobuf.Test.TestProtos, Version=1.0.0.0, Culture=neutral, PublicKeyToken=a7d26565bac4d604'.";

            Assert.AreEqual(expectedMessage, ex.Message);
        }
Пример #3
0
        /// <summary>
        /// Gets the value of the specified repeated extension, registering it if it doesn't exist
        /// </summary>
        public static RepeatedField <TValue> GetOrRegister <TTarget, TValue>(ref ExtensionSet <TTarget> set, RepeatedExtension <TTarget, TValue> extension) where TTarget : IExtendableMessage <TTarget>
        {
            IExtensionValue value;

            if (set == null)
            {
                value = extension.CreateValue();
                set   = new ExtensionSet <TTarget>();
                set.ValuesByNumber.Add(extension.FieldNumber, value);
            }
            else
            {
                if (!set.ValuesByNumber.TryGetValue(extension.FieldNumber, out value))
                {
                    value = extension.CreateValue();
                    set.ValuesByNumber.Add(extension.FieldNumber, value);
                }
            }

            return(((RepeatedExtensionValue <TValue>)value).GetValue());
        }
Пример #4
0
        /// <summary>
        /// Gets the value of the specified repeated extension or null if it doesn't exist in this set
        /// </summary>
        public static RepeatedField <TValue> Get <TTarget, TValue>(ref ExtensionSet <TTarget> set, RepeatedExtension <TTarget, TValue> extension) where TTarget : IExtendableMessage <TTarget>
        {
            IExtensionValue value;

            if (GetValue(ref set, extension, out value))
            {
                return(((RepeatedExtensionValue <TValue>)value).GetValue());
            }
            else
            {
                return(null);
            }
        }
Пример #5
0
        /// <summary>
        /// Gets the value of the specified repeated extension or null if it doesn't exist in this set
        /// </summary>
        public static RepeatedField <TValue> Get <TTarget, TValue>(ref ExtensionSet <TTarget> set, RepeatedExtension <TTarget, TValue> extension) where TTarget : IExtendableMessage <TTarget>
        {
            IExtensionValue value;

            if (TryGetValue(ref set, extension, out value))
            {
                if (value is RepeatedExtensionValue <TValue> extensionValue)
                {
                    return(extensionValue.GetValue());
                }
                else
                {
                    var valueType = value.GetType().GetTypeInfo();
                    if (valueType.IsGenericType && valueType.GetGenericTypeDefinition() == typeof(RepeatedExtensionValue <>))
                    {
                        var storedType = valueType.GenericTypeArguments[0];
                        throw new InvalidOperationException(
                                  "The stored extension value has a type of '" + storedType.AssemblyQualifiedName + "'. " +
                                  "This a different from the requested type of '" + typeof(TValue).AssemblyQualifiedName + "'.");
                    }
                    else
                    {
                        throw new InvalidOperationException("Unexpected extension value type: " + valueType.AssemblyQualifiedName);
                    }
                }
            }
            else
            {
                return(null);
            }
        }