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;
}
}
}