generic & static なクラスをキャッシュとして使うことである。
型引数が key、static メンバが value に相当する。
静的コンストラクタは、クラスの呼び出し時に1回だけ実行され、スレッドセーフである。
そして、型引数はコンパイル時に解決されるため、Dictionary などの動的な key ルックアップと比べて、圧倒的に早い。
new { 変数名 }.GetType().GetProperties()[0].Nameで変数名を文字列で取得できる。
private static class GenericCache<T>
{
public static string GetName<T>(this T source) where T : class
{
return GenericCache<T>.Name;
}
static GenericCache()
{
var properties = typeof(T).GetProperties();
Name = properties[0].Name;
}
public static readonly string Name;
}
public class MyCache<K,T>
{
private Dictionary<K, WeakReference> cache = new Dictionary<K, WeakReference>();
private object locker = new object();
public T GetItem(K key)
{
lock (locker)
{
WeakReference v;
if (!cache.TryGetValue(key, out v)) return default(T);
T val = (T)v.Target;
if (val != null) return val;
cache.Remove(key);
return default(T);
}
}
public void Add(K key, T val)
{
lock (locker)
{
cache[key] = new WeakReference(val);
}
}
}