using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Reflection; namespace Sheng.Winform.Controls.Kernal { /* * 想用 Dictionary> * 因为用于获取类构造函数的方法, type.GetConstructor * 接收的是一个Types数组,而一般的GetProperty,GetMethod接收的都是一个String * 构造函数接收的是Types数组,光光用Types数组做为缓存的Key * 是没意义的,因为两个同样内容的数组Eques是不会相同的,必须使用扩展方法判断数组的内容是否相同 * 所以用 GetAccessorKeyFunc 来专门为以Type数组做为缓存的构造函数Cache查找缓存中的key * 但是用object的话,在构造函数缓存中定位key时,每次都要进行Type数组和object的转换 * 比较麻烦,也可能会消耗性能,FastReflection的目的就是追求高性能, * 所以加一个TKeyType来标识key的类型 */ /// /// 这个缓存是全局的 /// /// /// public abstract class FastReflectionPool : IFastReflectionPool { private readonly object _mutex = new object(); private readonly Dictionary> _cache = new Dictionary>(); private bool _customCompare = false; /// /// /// public bool CustomCompare { get { return _customCompare; } set { _customCompare = value; } } /// /// /// /// /// /// protected virtual bool Compare(TKeyType key1, TKeyType key2) { return false; } /// /// /// /// /// /// public TAccessor Get(Type type, TKeyType key) { TAccessor accessor; if (this._cache.TryGetValue(type, out Dictionary accessorCache)) { TKeyType accessorKey; if (_customCompare) { accessorKey = accessorCache.Keys.Single((k) => { return Compare(k, key); }); } else { accessorKey = key; } if (accessorCache.TryGetValue(key, out accessor)) { return accessor; } } lock (_mutex) { if (this._cache.ContainsKey(type) == false) { this._cache[type] = new Dictionary(); } accessor = Create(type, key); this._cache[type][key] = accessor; return accessor; } } /// /// /// /// /// /// protected abstract TAccessor Create(Type type, TKeyType key); } }