よくある
class Hoge{
string HogeCode{get;set;}
private string __hogeName =null ;
//名前を取り出す。名前は別テーブルに入ってるのでHogeCodeを元に取得
string HogeName {
get{
if (__hogeName==null) {
__hogeName = db.GetHogeName(HogeCode) ; // DBから名前取ったりとか
}
return __hogeName;
}
}
コードが長い割に大したことやってないので毎回書くのがめんどい。
てってれー
/// <summary>
/// キャッシュ化された値を格納するディクショナリ
/// <ul>
/// <li>キャッシュされていたらキャッシュから値を返す</li>
/// <li>キャッシュされていなければpresenterを使って値をキャッシュする</li>
/// </ul>
/// </summary>
public class NameDictionary {
private Dictionary<string, object> dictionary = new Dictionary<string, object>();
/// <summary>
/// 値を取得する。
/// PropertyのGetterやGet**メソッドから使われることを想定
/// CallerMemberNameが取れないとエラーになるので注意
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="presenter"></param>
/// <param name="PropertyName"></param>
/// <returns></returns>
public T Get<T>(Func<T> presenter,[CallerMemberName] string PropertyName=null) {
return Get<T>(PropertyName, presenter);
}
/// <summary>
/// 値を取得する。
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="KeyName"></param>
/// <param name="presenter"></param>
/// <returns></returns>
public T Get<T>(string KeyName,Func<T> presenter) {
if (!dictionary.ContainsKey(KeyName)) {
dictionary.Add(KeyName, presenter());
}
return (T)dictionary[KeyName];
}
}
使い方
class Hoge{
string HogeCode{get;set;}
private NameDictionary dictionary = new NameDictionary();
//名前を取り出す。名前は別テーブルに入ってるのでHogeCodeを元に取得
string HogeName => dictionary.Get<string>(()=> db.GetHogeName(HogeCode) );
短くかけて大変うれしい。
注意
CallerMemberName
が取れないとエラーになるので、適宜 Get<T>(string,Func<T>)
を使う。