/// <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)) { return(((RepeatedExtensionValue <TValue>)value).GetValue()); } else { return(null); } }
/// <summary> /// Gets the value of the specified extension /// </summary> public static TValue Get <TTarget, TValue>(ref ExtensionSet <TTarget> set, Extension <TTarget, TValue> extension) where TTarget : IExtendableMessage <TTarget> { IExtensionValue value; if (TryGetValue(ref set, extension, out value)) { return(((ExtensionValue <TValue>)value).GetValue()); } else { return(extension.DefaultValue); } }
/// <summary> /// Clones the set into a new set. If the set is null, this returns null /// </summary> public static ExtensionSet <TTarget> Clone <TTarget>(ExtensionSet <TTarget> set) where TTarget : IExtendableMessage <TTarget> { if (set == null) { return(null); } var newSet = new ExtensionSet <TTarget>(); foreach (var pair in set.ValuesByNumber) { var cloned = pair.Value.Clone(); newSet.ValuesByNumber[pair.Key] = cloned; } return(newSet); }
/// <summary> /// Gets the value of the specified repeated extension, registering it if it doesn't exist /// </summary> public static RepeatedField <TValue> GetOrInitialize <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> /// Sets the value of the specified extension. This will make a new instance of ExtensionSet if the set is null. /// </summary> public static void Set <TTarget, TValue>(ref ExtensionSet <TTarget> set, Extension <TTarget, TValue> extension, TValue value) where TTarget : IExtendableMessage <TTarget> { ProtoPreconditions.CheckNotNullUnconstrained(value, nameof(value)); IExtensionValue extensionValue; if (set == null) { extensionValue = extension.CreateValue(); set = new ExtensionSet <TTarget>(); set.ValuesByNumber.Add(extension.FieldNumber, extensionValue); } else { if (!set.ValuesByNumber.TryGetValue(extension.FieldNumber, out extensionValue)) { extensionValue = extension.CreateValue(); set.ValuesByNumber.Add(extension.FieldNumber, extensionValue); } } ((ExtensionValue <TValue>)extensionValue).SetValue(value); }
/// <summary> /// Merges the second set into the first set, creating a new instance if first is null /// </summary> public static void MergeFrom <TTarget>(ref ExtensionSet <TTarget> first, ExtensionSet <TTarget> second) where TTarget : IExtendableMessage <TTarget> { if (second == null) { return; } if (first == null) { first = new ExtensionSet <TTarget>(); } foreach (var pair in second.ValuesByNumber) { IExtensionValue value; if (first.ValuesByNumber.TryGetValue(pair.Key, out value)) { value.MergeFrom(pair.Value); } else { var cloned = pair.Value.Clone(); first.ValuesByNumber[pair.Key] = cloned; } } }
/// <summary> /// Gets whether the value of the specified extension is set /// </summary> public static bool Has <TTarget, TValue>(ref ExtensionSet <TTarget> set, Extension <TTarget, TValue> extension) where TTarget : IExtendableMessage <TTarget> { IExtensionValue value; return(TryGetValue(ref set, extension, out value)); }