2017-03-21 1 views
0

私はコードから、リソースからその価値を引き出す必要がある多くのプロパティを持っています。だから私はたくさんありましたGetterの一般化

private string _labelText; 
public string LabelText 
{ 
    get 
    { 
     if (string.IsNullOrEmpty(_labelText)) 
      _labelText = GetFromResources(Constants.LabelText); 

     return _labelText; 
    } 
} 

私は毎回これを繰り返さないようにこのコードを一般化することができます。 ベストリターンは異なるタイプです。

ありがとうございます。

+0

[スニペットを書く](https://msdn.microsoft.com/en-us/library/ms165394.aspx?f=255&MSPPError=-2147217396) –

+0

私が書いたコードは見当たりませんでしたか? –

+0

青は美しい色です。素敵なコードですが、欠落している中括弧は除きます。そのようなコードの作成を自動化するスニペットを書くことができます。私はそれをお勧めします。 –

答えて

3

あなたはこのような何かを行うことができます。必要に応じて

private Dictionary<string, object> _cache = new Dictionary<string, object>(); 
public string LabelText => Get<string>(Constants.LabelText); 

private T Get<T>(string resource) 
{ 
    object value; 
    if (!_cache.TryGetValue(resource, out value)) 
     value = _cache[resource] = GetFromResources(resource); 
    return (T)value; 
} 

は、その後、あなたはそれらのワンライナー性の複数を作成することができます。

+0

リソース名のすべて/ほとんどがプロパティ名と等しい場合は、CallerMemberName属性を追加してワンライナーをパブリック文字列に減らすのが良いオプションです。LabelText => Get (); –

1

アイデアは、メソッドにスコープへのリソースの負荷のロジックであるかもしれない:

private static T LoadResource<T>(ref T cache,string name) { 
    if (string.IsNullOrEmpty(cache)) { 
      cache = (T) GetFromResources(name); 
    } 
    return cache; 
} 

その後、あなたのようなあなたのゲッターを書くことができます:あなたがフィールドを参照refを使用することにより

private string _labelText; 
public string LabelText { 
    get { 
     return LoadResource<string>(ref _labelText,Constants.LabelText); 
    } 
} 

、したがって、コードの他の部分でそのフィールドにアクセス/変更/ ...できます。