using System; using System.Collections; using System.Collections.Specialized; namespace Unity.VisualScripting { public abstract class DictionaryIndexMetadata : Metadata { protected DictionaryIndexMetadata(string subpathPrefix, int index, Metadata parent) : base(subpathPrefix + index, parent) { this.index = index; Reflect(true); } public int index { get; private set; } protected bool parentIsOrderedDictionary { get; private set; } protected override void OnParentValueChange(object previousValue) { base.OnParentValueChange(previousValue); Reflect(false); } protected abstract Type GetDefinedType(Type dictionaryType); private void Reflect(bool throwOnFail) { if (typeof(IDictionary).IsAssignableFrom(parent.valueType)) { definedType = GetDefinedType(parent.valueType); parentIsOrderedDictionary = typeof(IOrderedDictionary).IsAssignableFrom(parent.valueType); } else { if (throwOnFail) { throw new InvalidOperationException("Parent of dictionary index is not a dictionary:\n" + this); } else { Unlink(); return; } } label = parent.label; } public override Attribute[] GetCustomAttributes(bool inherit = true) { return parent.GetCustomAttributes(inherit); } } }