c#在一个对象中存储不同的设置

时间:2013-06-22 09:48:06

标签: c# casting

我有一个对象代表正在发生的当前事件。此事件包含许多设置。将所有设置变量存储在事件对象中的最佳做法是什么?

设置存储在数据库中(现在基于基类的不同列:ValueString,ValueInt,ValueBool,ValueDateTime,ValueFloat,ValueDecimal)。唯一键表示数据库中的设置。

只要我加载了事件对象,我就会将其存储在本地缓存中以便快速访问。

我应该把所有东西都投射到物体上吗? (感觉像不需要的演员阵容来获取/设置设置)

class Event
{
    // string = settings key
    Dictionary<string, object> _settings;

    public void AddSetting(string key, object value)
    public object GetSetting(string key)
}

或者我应该在不同的词典中使用它?

class Event
{
    // string = settings key
    Dictionary<string, string> _settingStrings;
    Dictionary<string, int> _settingInts;
    ...

    public void AddSetting(string key, string value)
    public void AddSetting(string key, int value)
    ...

    public string GetStringSetting(string key)
    public int GetIntSetting(string key)    
    ...
}

有什么想法吗?

2 个答案:

答案 0 :(得分:5)

您可以将所有内容存储为Object,但不是执行直接投射,而是使用泛型来构建易于使用的API:

private IDictionary<string,object> _settings = new Dictionary<string,object>();

public void AddSetting<T>(string key, T value) {
    _settings[key] = value;
}
public T GetSetting<T>(string key, T notFound = default(T)) {
    object res;
    if (!_settings.TryGetValue(key, out res) || !(res is T)) {
        return notFound;
    }
    return (T)res;
}

演员阵容仍在那里,但API会将其隐藏起来:现在用户可以安全地编写

string searchPath = settingContainer.GetSetting<string>("searchPath");
int retryCount = settingContainer.GetSetting<int>("retryCount", -1);

答案 1 :(得分:0)

我真的喜欢dasblinkenlight的回答。

除了为每种数据类型浪费一列之外,我宁愿在数据表上只有一列(可能是一个VARCHAR)。

这样做的好处:

  • 阅读速度更快(只有一个索引列)
  • 节省存储空间(每行只有一个varchar)

然后你可以使用提到的泛型,或者将你的实现中的字符串对象强制转换为你想要的类型。