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

Pat*_*ick 2 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)
}
Run Code Online (Sandbox Code Playgroud)

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

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)    
    ...
}
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

das*_*ght 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;
}
Run Code Online (Sandbox Code Playgroud)

演员阵容仍在那里,但API隐藏了用户:现在用户可以安全地写

string searchPath = settingContainer.GetSetting<string>("searchPath");
int retryCount = settingContainer.GetSetting<int>("retryCount", -1);
Run Code Online (Sandbox Code Playgroud)