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