2017-03-21 25 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屬性並將公共字符串減少爲public string LabelText =>獲取(); –

1

一個想法可能是範圍的資源加載的邏輯放到一個方法:

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

然後,你可以寫你的干將,如:

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

通過使用你引用一個字段ref,並因此可以在代碼的其他部分訪問/修改/ ...該字段。