using System; using System.Collections.Generic; using System.Linq; namespace Umbraco.Core.Models { /// /// Represents the pre-value data for a DataType /// /// /// Due to the legacy nature of the data that can be stored for pre-values, we have this class which encapsulates the 2 different /// ways that pre-values are stored: A string array or a Dictionary. /// /// Most legacy property editors won't support the dictionary format but new property editors should always use the dictionary format. /// In order to get overrideable pre-values working we need a dictionary since we'll have to reference a pre-value by a key. /// public class PreValueCollection { private IDictionary _preValuesAsDictionary; private IEnumerable _preValuesAsArray; public IEnumerable PreValuesAsArray { get { if (_preValuesAsArray == null) { throw new InvalidOperationException("The current pre-value collection is dictionary based, use the PreValuesAsDictionary property instead"); } return _preValuesAsArray; } set { _preValuesAsArray = value; } } public IDictionary PreValuesAsDictionary { get { if (_preValuesAsDictionary == null) { throw new InvalidOperationException("The current pre-value collection is array based, use the PreValuesAsArray property instead"); } return _preValuesAsDictionary; } set { _preValuesAsDictionary = value; } } /// /// Check if it is a dictionary based collection /// public bool IsDictionaryBased { get { return _preValuesAsDictionary != null; } } public PreValueCollection(IEnumerable preVals) { _preValuesAsArray = preVals; } public PreValueCollection(IDictionary preVals) { _preValuesAsDictionary = preVals; } /// /// Regardless of how the pre-values are stored this will return as a dictionary, it will convert an array based to a dictionary /// /// public IDictionary FormatAsDictionary() { if (IsDictionaryBased) { return PreValuesAsDictionary; } //it's an array so need to format it, the alias will just be an iteration var result = new Dictionary(); var asArray = PreValuesAsArray.ToArray(); for (var i = 0; i < asArray.Length; i++) { result.Add(i.ToInvariantString(), asArray[i]); } return result; } } }