推广吸气剂

时间:2017-03-21 15:44:35

标签: c# generics getter

我的代码中有很多属性,我必须从资源中获取它们的价值。

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

        return _labelText;
    }
}

如何对此代码进行概括,以便每次都不重复。 最好的是返回不同的类型。

谢谢。

2 个答案:

答案 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;
}

然后,您可以根据需要创建多个单线程属性。

答案 1 :(得分:1)

一个想法可能是将资源加载的逻辑范围限定为方法:

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

然后你可以写下你的getters:

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

使用ref引用一个字段,因此可以在代码的其他部分访问/修改/ ...该字段。