using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Globalization; using DPumpHydr.WinFrmUI.WenSkin.Json.Utilities; namespace DPumpHydr.WinFrmUI.WenSkin.Json.Serialization { /// /// A collection of objects. /// public class JsonPropertyCollection : KeyedCollection { private readonly Type _type; private readonly List _list; /// /// Initializes a new instance of the class. /// /// The type. public JsonPropertyCollection(Type type) : base((IEqualityComparer)StringComparer.Ordinal) { ValidationUtils.ArgumentNotNull(type, "type"); _type = type; _list = (List)base.Items; } /// /// When implemented in a derived class, extracts the key from the specified element. /// /// The element from which to extract the key. /// The key for the specified element. protected override string GetKeyForItem(JsonProperty item) { return item.PropertyName; } /// /// Adds a object. /// /// The property to add to the collection. public void AddProperty(JsonProperty property) { if (Contains(property.PropertyName)) { if (property.Ignored) { return; } JsonProperty jsonProperty = base[property.PropertyName]; bool flag = true; if (jsonProperty.Ignored) { Remove(jsonProperty); flag = false; } else if (property.DeclaringType != null && jsonProperty.DeclaringType != null) { if (property.DeclaringType.IsSubclassOf(jsonProperty.DeclaringType) || (jsonProperty.DeclaringType.IsInterface() && property.DeclaringType.ImplementInterface(jsonProperty.DeclaringType))) { Remove(jsonProperty); flag = false; } if (jsonProperty.DeclaringType.IsSubclassOf(property.DeclaringType) || (property.DeclaringType.IsInterface() && jsonProperty.DeclaringType.ImplementInterface(property.DeclaringType))) { return; } } if (flag) { throw new JsonSerializationException("A member with the name '{0}' already exists on '{1}'. Use the JsonPropertyAttribute to specify another name.".FormatWith(CultureInfo.InvariantCulture, property.PropertyName, _type)); } } Add(property); } /// /// Gets the closest matching object. /// First attempts to get an exact case match of propertyName and then /// a case insensitive match. /// /// Name of the property. /// A matching property if found. public JsonProperty GetClosestMatchProperty(string propertyName) { JsonProperty property = GetProperty(propertyName, StringComparison.Ordinal); if (property == null) { property = GetProperty(propertyName, StringComparison.OrdinalIgnoreCase); } return property; } private bool TryGetValue(string key, out JsonProperty item) { if (base.Dictionary == null) { item = null; return false; } return base.Dictionary.TryGetValue(key, out item); } /// /// Gets a property by property name. /// /// The name of the property to get. /// Type property name string comparison. /// A matching property if found. public JsonProperty GetProperty(string propertyName, StringComparison comparisonType) { if (comparisonType == StringComparison.Ordinal) { if (TryGetValue(propertyName, out var item)) { return item; } return null; } for (int i = 0; i < _list.Count; i++) { JsonProperty jsonProperty = _list[i]; if (string.Equals(propertyName, jsonProperty.PropertyName, comparisonType)) { return jsonProperty; } } return null; } } }