<PackageReference Include="Castle.Core" Version="4.1.1" />

DictionaryAdapterMeta

public class DictionaryAdapterMeta
using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; namespace Castle.Components.DictionaryAdapter { [DebuggerDisplay("Type: {Type.FullName,nq}")] public class DictionaryAdapterMeta { private IDictionary extendedProperties; private readonly Func<DictionaryAdapterInstance, IDictionaryAdapter> creator; public Type Type { get; set; } public Type Implementation { get; set; } public object[] Behaviors { get; set; } public IDictionaryAdapterFactory Factory { get; set; } public IDictionary<string, PropertyDescriptor> Properties { get; set; } public IDictionaryMetaInitializer[] MetaInitializers { get; set; } public IDictionaryInitializer[] Initializers { get; set; } public IDictionary ExtendedProperties { get { if (extendedProperties == null) extendedProperties = new Dictionary<object, object>(); return extendedProperties; } } public DictionaryAdapterMeta(Type type, Type implementation, object[] behaviors, IDictionaryMetaInitializer[] metaInitializers, IDictionaryInitializer[] initializers, IDictionary<string, PropertyDescriptor> properties, IDictionaryAdapterFactory factory, Func<DictionaryAdapterInstance, IDictionaryAdapter> creator) { Type = type; Implementation = implementation; Behaviors = behaviors; MetaInitializers = metaInitializers; Initializers = initializers; Properties = properties; Factory = factory; this.creator = creator; InitializeMeta(); } public PropertyDescriptor CreateDescriptor() { IDictionaryMetaInitializer[] metaInitializers = MetaInitializers; List<object> list = CollectSharedBehaviors(Behaviors, metaInitializers); List<IDictionaryInitializer> list2 = CollectSharedBehaviors(Initializers, metaInitializers); PropertyDescriptor propertyDescriptor = (list != null) ? new PropertyDescriptor(list.ToArray()) : new PropertyDescriptor(); propertyDescriptor.AddBehaviors(metaInitializers); if (list2 != null) propertyDescriptor.AddBehaviors(list2); return propertyDescriptor; } private static List<T> CollectSharedBehaviors<T>(T[] source, IDictionaryMetaInitializer[] predicates) { List<T> list = null; foreach (T val in source) { for (int j = 0; j < predicates.Length; j++) { if (predicates[j].ShouldHaveBehavior(val)) { if (list == null) list = new List<T>(source.Length); list.Add(val); break; } } } return list; } public DictionaryAdapterMeta GetAdapterMeta(Type type) { return Factory.GetAdapterMeta(type, this); } public object CreateInstance(IDictionary dictionary, PropertyDescriptor descriptor) { DictionaryAdapterInstance arg = new DictionaryAdapterInstance(dictionary, this, descriptor, Factory); return creator(arg); } private void InitializeMeta() { IDictionaryMetaInitializer[] metaInitializers = MetaInitializers; for (int i = 0; i < metaInitializers.Length; i++) { metaInitializers[i].Initialize(Factory, this); } } } }