/// <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; } }
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); }
/// <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()); }
/// <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); } }
/// <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); } }