<PackageReference Include="Castle.Core" Version="4.0.0-alpha001" />

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; private static readonly IDictionaryInitializer[] NoInitializers = new IDictionaryInitializer[0]; 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; List<IDictionaryBehavior> behaviorsInternal; if (descriptor == null || (behaviorsInternal = descriptor.BehaviorsInternal) == null) { Initializers = meta.Initializers; Properties = MergeProperties(meta.Properties); } else { Initializers = MergeInitializers(meta.Initializers, behaviorsInternal); Properties = MergeProperties(meta.Properties, behaviorsInternal); } } public void AddCopyStrategy(IDictionaryCopyStrategy copyStrategy) { if (copyStrategy == null) throw new ArgumentNullException("copyStrategy"); if (copyStrategies == null) copyStrategies = new List<IDictionaryCopyStrategy>(); copyStrategies.Add(copyStrategy); } private static IDictionaryInitializer[] MergeInitializers(IDictionaryInitializer[] source, List<IDictionaryBehavior> behaviors) { List<IDictionaryInitializer> dictionaryBehaviors = null; int num = source.Length; for (int i = 0; i < num; i++) { PropertyDescriptor.MergeBehavior(ref dictionaryBehaviors, source[i]); } num = behaviors.Count; for (int i = 0; i < num; i++) { IDictionaryInitializer behavior; if ((behavior = (behaviors[i] as IDictionaryInitializer)) != null) PropertyDescriptor.MergeBehavior(ref dictionaryBehaviors, behavior); } if (dictionaryBehaviors != null) return dictionaryBehaviors.ToArray(); return NoInitializers; } private static IDictionary<string, PropertyDescriptor> MergeProperties(IDictionary<string, PropertyDescriptor> source) { Dictionary<string, PropertyDescriptor> dictionary = new Dictionary<string, PropertyDescriptor>(); foreach (KeyValuePair<string, PropertyDescriptor> item in source) { dictionary[item.Key] = new PropertyDescriptor(item.Value, true); } return dictionary; } private static IDictionary<string, PropertyDescriptor> MergeProperties(IDictionary<string, PropertyDescriptor> source, List<IDictionaryBehavior> behaviors) { int count = behaviors.Count; Dictionary<string, PropertyDescriptor> dictionary = new Dictionary<string, PropertyDescriptor>(); foreach (KeyValuePair<string, PropertyDescriptor> item in source) { PropertyDescriptor propertyDescriptor = new PropertyDescriptor(item.Value, true); for (int i = 0; i < count; i++) { propertyDescriptor.AddBehavior(behaviors[i]); } dictionary[item.Key] = propertyDescriptor; } return dictionary; } } }