通过自定义属性设置特定属性的值

约翰·汉森(Joakim Hansson)

我当前正在开发一个供用户使用的软件,该软件应该不能访问所有后端,但仍然应该能够轻松更改应用程序的配置/设置。我决定最好的方法是在最终构建目录的根目录中添加自定义“配置文件(.cfg)”。.cfg文件的简单示例:

serveraddress='10.10.10.10'
serverport='1234'
servertimeout='15000'

因为我希望配置文件易于扩展,所以我决定使用一些自定义属性和一些简单的LINQ。确实可以按我期望的那样工作,但是由于我仍然是.net的新手,所以我担心我并没有采用最佳方法,因此我的问题是:我可以做些什么来改善此问题?还是一般来说有更好的方法?

这是我的代码,用于读取配置文件并将值分配给它的相应属性。

ConfigFileHandler.cs

public void ReadConfigFile()
    {
        var cfgFile = new ConfigFile();
        var configLines = File.ReadAllLines("configfile.cfg");
        var testList = configLines.Select(line => line.Split('='))
            .Select(splitString => new Tuple<string, string>(splitString[0], splitString[1].Replace("'", "")))
            .ToList();
        foreach (var prop in typeof(ConfigFile).GetProperties())
        {
            var attrs = (ConfigFileFieldAttribute[])prop.GetCustomAttributes
                (typeof(ConfigFileFieldAttribute), false);
            foreach (var t in from attr in attrs from t in testList where t.Item1 == attr.Name select t)
            {
                prop.SetValue(cfgFile, t.Item2);
            }
        }
    }

ConfigFile.cs

 class ConfigFile
    {
        private static string _serverAddress;
        private static int _serverPort;
        private static int _serverTimeout;

        [ConfigFileField(@"serveraddress")]
        public string ServerAddress
        {
            get { return _serverAddress; }
            set { _serverAddress= value; }
        }

        [ConfigFileField(@"serverport")]
        public string ServerPort
        {
            get { return _serverPort.ToString(); }
            set { _serverPort= int.Parse(value); }
        }

        [ConfigFileField(@"servertimeout")]
        public string ServerTimeout
        {
            get { return _serverTimeout.ToString(); }
            set { _serverTimeout= int.Parse(value); }
        }
    }

编写外观更好的代码的任何技巧将不胜感激!


更新:感谢您的所有反馈。

下面是期末课程!https://dotnetfiddle.net/bPMnJA的实时示例

请注意,这是C#6.0

ConfigFileHandler.cs

 public class ConfigFileHandler
 {
    public void ReadConfigFile()
    {
        var configLines = File.ReadAllLines("configfile.cfg");
        var configDictionary = configLines.Select(line => line.Split('='))
        .Select(splitString => new Tuple<string, string>(splitString[0],     splitString[1].Replace("'", "")))
        .ToDictionary(kvp => kvp.Item1, kvp => kvp.Item2);
        ConfigFile.SetDictionary(configDictionary);
    }
 }

ConfigFile.cs

 public class ConfigFile
 {
    private static Dictionary<string, string> _configDictionary;

    public string ServerAddress => PullValueFromConfig<string>("serveraddress", "10.1.1.10");

    public int ServerPort => PullValueFromConfig<int>("serverport", "3306");

    public long ServerTimeout => PullValueFromConfig<long>("servertimeout", "");


    private static T PullValueFromConfig<T>(string key, string defaultValue)
    {
        string value;
        if (_configDictionary.TryGetValue(key, out value) && value.Length > 0)
            return (T) Convert.ChangeType(value, typeof (T));
        return (T) Convert.ChangeType(defaultValue, typeof (T));

    }

    public static void SetDictionary(Dictionary<string, string> configValues)
    {
        _configDictionary = configValues;
    }
 }
菲尔·沃尔顿

通过将值加载到字典中,然后将其传递到ConfigFile类中,可以保持配置文件的简单性并摆脱嵌套循环。

    public static void ReadConfigFile()
    {
        var configLines = File.ReadAllLines("configfile.cfg");
        var testList = configLines.Select(line => line.Split('='))
            .Select(splitString => new Tuple<string, string>(splitString[0], splitString[1].Replace("'", "")))
            .ToDictionary(kvp => kvp.Item1, kvp => kvp.Item2);

        var cfgFile = new ConfigFile(testList);
    }

新的ConfigFile类:

class ConfigFile
{
    private Dictionary<string, string> _configDictionary;

    public ConfigFile(Dictionary<string, string> configValues)
    {
        _configDictionary = configValues;
    }

    public string ServerAddress
    {
        get { return PullValueFromConfig("serveraddress", "192.168.1.1"); }
    }

    public string ServerPort
    {
        get { return PullValueFromConfig("serverport", "80"); }
    }

    public string ServerTimeout
    {
        get { return PullValueFromConfig("servertimeout", "900"); }
    }

    private string PullValueFromConfig(string key, string defaultValue)
    {
            string value;
            if (_configDictionary.TryGetValue(key, out value))
                return value;
            return defaultValue;
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

设置自定义属性

通过Object.assign设置CSS自定义属性

使用自定义属性值在模板中设置颜色

如何为CSS自定义属性设置“ inherit”的值?

通过自定义属性传递值以进行方法访问

如何通过 JavaScript 更改 HTML 自定义属性值?

选择自定义属性以设置样式

如何设置自定义UIView属性

角度自定义组件属性设置

如何设置MSI自定义属性

当自定义属性值上的值为空时,隐藏特定于前视图的属性

如何通过传递枚举值和属性类型来获取枚举的自定义属性?

VueJS 通过属性值将自定义属性传递给子组件

获取自定义属性值

jQuery警报自定义属性的值

如何通过自定义属性对Type属性进行排序

从特定对象的属性/字段获取自定义属性

HTML select onchange获取将自定义属性值设置为其他输入值

获取要在自定义属性中使用的属性值

自定义属性以使用空值过滤属性

C#,过滤自定义属性属性值

如何通过 XAML 标记将自定义类实例设置为 Button.Content 属性?

在Swift中的自定义UIView子类中通过UIAppearance设置文本属性

通过IB将属性设置为自定义子视图init(用于uitableviewcell模板)

迭代自定义对象列表,过滤条件并设置特定属性

unittest.mock:在特定的模拟对象上设置自定义属性(变量)

将自定义对象设置为微调框并显示特定属性

如何通过特定属性按降序对自定义对象的NSArray进行排序?

使用自定义设置器定义可变属性