在app.config中扩展键值对功能

时间:2014-11-04 15:02:22

标签: c# configuration visual-studio-2013

我的控制台应用程序中有一系列规则要在app.config中打开和关闭。

App.config支持键值对,所以很好的时候 - 我可以简单地定义一些规则键并将标志存储在值中。

我现在想添加一个我可以阅读的定制评论字段来获取规则说明。但是,似乎没有任何设施可以做到这一点。

显然,我可以滚动自己的配置文件并使用标准XML方法读取它,但我认为必须有更好的方法在app.config文件中执行此操作。

我还可以在键/值中包含注释,但这似乎也不能令人满意。

有什么想法吗?

2 个答案:

答案 0 :(得分:4)

好的,按照Pavel的初始线索和我得到的一些代码here,我设法产生以下内容。希望它对其他疲惫的旅行者有用! : - )

<强>的App.config

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="RuleSet" type="ExtendedKVP.RuleSection, ExtendedKVP" />
  </configSections>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
  </startup>
  <RuleSet>
    <TheRules>
      <add ruleId="RL101" ruleActive="true" ruleDesc="Don't do this" />
      <add ruleId="RL202" ruleActive="false" ruleDesc="Avoid that" />
      <add ruleId="RL303" ruleActive="true" ruleDesc="Missing the other" />
    </TheRules>
  </RuleSet>
</configuration>

<强> Program.cs的

using System;
using System.Configuration;

namespace ExtendedKVP
{
    class Program
    {
        static void Main(string[] args)
        {           
            var connectionManagerDataSection = ConfigurationManager.GetSection(RuleSection.SectionName) as RuleSection;
            if (connectionManagerDataSection != null)
            {
                foreach (RuleElement element in connectionManagerDataSection.ConnectionManagerEndpoints)
                {
                    Console.WriteLine(string.Format("RuleId: {0}, RuleActive: {1}, RuleDesc: {2}", element.RuleId, element.RuleActive, element.RuleDesc));                
                }
            }
        }
    }
}

<强> ConfigReader.cs

using System.Configuration;

namespace ExtendedKVP
{
    public class RuleSection : ConfigurationSection
    {       
        public const string SectionName = "RuleSet";

        private const string RuleCollectionName = "TheRules";

        [ConfigurationProperty(RuleCollectionName)]
        [ConfigurationCollection(typeof(RuleCollection), AddItemName = "add")]
        public RuleCollection ConnectionManagerEndpoints { get { return (RuleCollection)base[RuleCollectionName]; } }
    }

    public class RuleCollection : ConfigurationElementCollection
    {
        protected override ConfigurationElement CreateNewElement()
        {
            return new RuleElement();
        }

        protected override object GetElementKey(ConfigurationElement element)
        {
            return ((RuleElement)element).RuleId;
        }
    }

    public class RuleElement : ConfigurationElement
    {
        [ConfigurationProperty("ruleId", IsRequired = true)]
        public string RuleId
        {
            get { return (string)this["ruleId"]; }
            set { this["ruleId"] = value; }
        }

        [ConfigurationProperty("ruleDesc", IsRequired = true)]
        public string RuleDesc
        {
            get { return (string)this["ruleDesc"]; }
            set { this["ruleDesc"] = value; }
        }

        [ConfigurationProperty("ruleActive", IsRequired = false, DefaultValue = false)]
        public bool RuleActive
        {
            get { return (bool)this["ruleActive"]; }
            set { this["ruleActive"] = value; }
        }       
    }
}

答案 1 :(得分:2)

您可以在app.config中创建自己的配置部分,并将其用于自定义设置。

点击here了解详情。