DictionaryAdapterInstance
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
namespace Castle.Components.DictionaryAdapter
{
public class DictionaryAdapterInstance
{
private IDictionary extendedProperties;
private List<IDictionaryCopyStrategy> copyStrategies;
internal int? OldHashCode { get; set; }
public IDictionary Dictionary { get; set; }
public PropertyDescriptor Descriptor { get; set; }
public IDictionaryAdapterFactory Factory { get; set; }
public IDictionaryInitializer[] Initializers { get; set; }
public IDictionary<string, PropertyDescriptor> Properties { get; set; }
public IDictionaryEqualityHashCodeStrategy EqualityHashCodeStrategy { get; set; }
public IDictionaryCreateStrategy CreateStrategy { get; set; }
public IDictionaryCoerceStrategy CoerceStrategy { get; set; }
public IEnumerable<IDictionaryCopyStrategy> CopyStrategies => copyStrategies ?? Enumerable.Empty<IDictionaryCopyStrategy>();
public IDictionary ExtendedProperties {
get {
if (extendedProperties == null)
extendedProperties = new Dictionary<object, object>();
return extendedProperties;
}
}
public DictionaryAdapterInstance(IDictionary dictionary, DictionaryAdapterMeta meta, PropertyDescriptor descriptor, IDictionaryAdapterFactory factory)
{
Dictionary = dictionary;
Descriptor = descriptor;
Factory = factory;
Properties = meta.Properties;
Initializers = meta.Initializers;
MergeBehaviorOverrides(meta);
}
public void AddCopyStrategy(IDictionaryCopyStrategy copyStrategy)
{
if (copyStrategy == null)
throw new ArgumentNullException("copyStrategy");
if (copyStrategies == null)
copyStrategies = new List<IDictionaryCopyStrategy>();
copyStrategies.Add(copyStrategy);
}
private void MergeBehaviorOverrides(DictionaryAdapterMeta meta)
{
if (Descriptor != null) {
DictionaryDescriptor dictionaryDescriptor = Descriptor as DictionaryDescriptor;
if (dictionaryDescriptor != null)
Initializers = Initializers.Prioritize(dictionaryDescriptor.Initializers).ToArray();
Properties = new Dictionary<string, PropertyDescriptor>();
foreach (KeyValuePair<string, PropertyDescriptor> property in meta.Properties) {
PropertyDescriptor value = property.Value;
PropertyDescriptor value2 = new PropertyDescriptor(value, false).AddKeyBuilders(value.KeyBuilders.Prioritize(Descriptor.KeyBuilders)).AddGetters(value.Getters.Prioritize(Descriptor.Getters)).AddSetters(value.Setters.Prioritize(Descriptor.Setters));
Properties.Add(property.Key, value2);
}
}
}
}
}