RaUI/Source/ryControls/Sheng.Winform.Controls/Kernal/FastReflection/FastReflectionPool.cs
鑫Intel 8b41f58f5c ### 2021-07-01更新
------
#### ryControlsV4    V3.0.2107.0101
- *.[新增]新增Sheng.Winform.Controls部分控件。

#### RyWeb    V3.0.2107.0101
- *.[新增]QuickWeb新增引用页设置。
#### MyDbV4    V3.0.2107.0101
- *.[新增]支持忽略大小写的替换功能。
2021-07-04 09:41:31 +08:00

75 lines
2.7 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
namespace Sheng.Winform.Controls.Kernal
{
/*
* 想用 Dictionary<Type, Dictionary<object, TAccessor>>
* 因为用于获取类构造函数的方法, 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<TKeyType, TAccessor> : IFastReflectionPool<TKeyType,TAccessor>
{
private object _mutex = new object();
private Dictionary<Type, Dictionary<TKeyType, TAccessor>> _cache =
new Dictionary<Type, Dictionary<TKeyType, TAccessor>>();
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;
Dictionary<TKeyType, TAccessor> accessorCache;
if (this._cache.TryGetValue(type, out 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<TKeyType, TAccessor>();
}
accessor = Create(type, key);
this._cache[type][key] = accessor;
return accessor;
}
}
protected abstract TAccessor Create(Type type, TKeyType key);
}
}