C# 程序配置文件的使用

2017年4月20日

最近在做一个工具类,功能包括:操作远程的FTP、调用http接口执行动作。这时候如果把Ftp地址、账号密码等写在程序内,将来会很不方便维护。所以我把使用配置文件来保存这些信息。
操作配置文件使用C#的System.Configuration库完成,需要给项目添加System.Configuration引用。
先对C#的类库做一层封装,使用这个类就可以对项目的xxx.exe.Config文件进行读写操作。

    /// <summary>
    /// 配置文件操作类
    /// </summary>
    class ConfigureAppConfig
    {
        /// <summary>
        /// 修改AppSettings中配置
        /// </summary>
        /// <param name="key">key值</param>
        /// <param name="value">相应值</param>
        public static bool SetConfigValue(string key, string value)
        {
            try
            {
                Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
                if (config.AppSettings.Settings[key] != null)
                    config.AppSettings.Settings[key].Value = value;
                else
                    config.AppSettings.Settings.Add(key, value);
                config.Save(ConfigurationSaveMode.Modified);
                ConfigurationManager.RefreshSection("appSettings");
                return true;
            }
            catch
            {
                return false;
            }
        }

        /// <summary>
        /// 获取AppSettings中某一节点值
        /// </summary>
        /// <param name="key"></param>
        public static string GetConfigValue(string key)
        {
            Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
            if (config.AppSettings.Settings[key] != null)
                return config.AppSettings.Settings[key].Value;
            return string.Empty;
        }
    }

自定义特性,来判断Config实体类中哪些需要保存

    [AttributeUsage(AttributeTargets.Field | AttributeTargets.Property)]
    public class ConfigAttribute : Attribute
    {
        public ConfigAttribute(): this(true)
        {
            
        }
        public ConfigAttribute(bool need)
        {
            this.Need = need;
        }
        public bool Need { get; }
    }

然后开始构建配置文件的实体类,使用反射来初始化Global类

 internal class Global
    {
        
        private Global()
        {
            _props = GetPropertyInfoArray();
            InitConfig();
        }

        #region Instance

        private static Global _ins;
        public static Global Ins => _ins ?? (_ins = new Global());

        #endregion

        private readonly List<PropertyInfo> _props = null;

        /// <summary>
        /// 获取所有需要读取和保存的字段
        /// </summary>
        /// <returns></returns>
        private List<PropertyInfo> GetPropertyInfoArray()
        {
            List<PropertyInfo> props = new List<PropertyInfo>();
            try
            {
                Type type = GetType();
                //获取所有字段
                PropertyInfo[] temps = type.GetProperties(BindingFlags.Public | BindingFlags.Instance);

                foreach (PropertyInfo propertyInfo in temps)
                {
                    //获取特性
                    IEnumerable<Attribute> attributes = propertyInfo.GetCustomAttributes();
                    foreach (Attribute attribute in attributes)
                    {
                        if (!(attribute is ConfigAttribute)) continue;
                        ConfigAttribute at = attribute as ConfigAttribute;
                        if (at.Need)
                        {
                            props.Add(propertyInfo);
                        }
                        break;
                    }
                }

            }
            catch (Exception)
            {
                // ignored
            }
            return props;
        }

        /// <summary>
        /// 初始化
        /// </summary>
        private void InitConfig()
        {
            foreach (PropertyInfo propertyInfo in _props)
            {
                string temp = ConfigureAppConfig.GetConfigValue(propertyInfo.Name);
                propertyInfo.SetValue(this, temp);
            }
        }

        /// <summary>
        /// 保存配置
        /// </summary>
        public void SaveConfig()
        {
            foreach (PropertyInfo propertyInfo in _props)
            {
                string temp = propertyInfo.GetValue(this).ToString();
                ConfigureAppConfig.SetConfigValue(propertyInfo.Name, temp);
            }
        }

        /// <summary>
        /// ftp地址
        /// </summary>
        [Config]
        public string FtpUrl { get; set; };

        /// <summary>
        /// ftp用户名
        /// </summary>
        [Config]
        public string UserName { get; set; };

        /// <summary>
        /// ftp密码
        /// </summary>
        [Config]
        public string PassWord { get; set; };

        /// <summary>
        /// 解压路径
        /// </summary>
        [Config]
        public string UzipUrl { get; set; };

        /// <summary>
        /// 资源获取路径
        /// </summary>
        [Config]
        public string ResUrl { get; set; };

        /// <summary>
        /// http接口地址
        /// </summary>
        [Config]
        public string ApiFriendUrl { get; set; };

        [Config]
        public string StartString { get; set; };


        public string RegionStr { get; set; };
        public Dictionary<string,string[][]> RegionSite=new Dictionary<string, string[][]>();
    }

在程序需要使用Config文件的时候,直接通过Global.Ins.XXX就可以访问配置参数了。

没有评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注