c#自定义配置节点(web.config、app.config)

这里提供一个实例的完整写法,深入了解的话请参考官方的文档

1.项目引用System.Configuration

2.编写PositionConfigurationSection,代码如下:

public class PositionConfigurationSection: ConfigurationSection
    {
        [ConfigurationProperty("Positions", IsRequired =true)]
        [ConfigurationCollection(typeof(PositionSection),CollectionType =ConfigurationElementCollectionType.AddRemoveClearMap,AddItemName ="Position")]
        public PositionContainer Positions
        {
            get => base["Positions"] as PositionContainer;
            set => base["Positions"] = value;
        }
    }

3.编写PositionContainer:

 public class PositionContainer : ConfigurationElementCollection
    {
        protected override ConfigurationElement CreateNewElement()
        {
            return new PositionSection();
        }

        protected override object GetElementKey(ConfigurationElement element)
        {
            return (element as PositionSection).ID;
        }
    }

4.编写PositionSection:

  public class PositionSection: ConfigurationElement
    {
        [ConfigurationProperty("ID", IsRequired = true)]
        public int ID
        {
            get =>Convert.ToInt32(base["ID"]);
            set => base["ID"] = value;
        }
        [ConfigurationProperty("Title", IsRequired = true)]
        public string Title
        {
            get => base["Title"].ToString();
            set => base["Title"] = value;
        }
        [ConfigurationProperty("Blocks", IsRequired = true)]
        [ConfigurationCollection(typeof(BlockSection), CollectionType = ConfigurationElementCollectionType.AddRemoveClearMap,AddItemName ="Block")]
        public BlockContainer Blocks
        {
            get => base["Blocks"] as BlockContainer;
            set => base["Blocks"] = value;
        }
    }

5.编写BlockContainer:

 public class BlockContainer : ConfigurationElementCollection
    {
        protected override ConfigurationElement CreateNewElement()
        {
            return new BlockSection();
        }

        protected override object GetElementKey(ConfigurationElement element)
        {
            return (element as BlockSection).ID;
        }
    }

6.编写BlockSection:

 public class BlockSection: ConfigurationElement
    {
        [ConfigurationProperty("ID", IsRequired = true)]
        public int ID
        {
            get => Convert.ToInt32(base["ID"]);
            set => base["ID"] = value;
        }
        [ConfigurationProperty("Title", IsRequired = true)]
        public string Title
        {
            get => base["Title"].ToString();
            set => base["Title"] = value;
        }
        [ConfigurationProperty("X", IsRequired = true)]
        public double X
        {
            get => Convert.ToDouble(base["X"]);
            set => base["X"] = value;
        }
        [ConfigurationProperty("Y", IsRequired = true)]
        public double Y
        {
            get => Convert.ToDouble(base["Y"]);
            set => base["Y"] = value;
        }
        [ConfigurationProperty("Width", IsRequired = true)]
        public double Width
        {
            get => Convert.ToDouble(base["Width"]);
            set => base["Width"] = value;
        }
        [ConfigurationProperty("Height", IsRequired = true)]
        public double Height
        {
            get => Convert.ToDouble(base["Height"]);
            set => base["Height"] = value;
        }
    }

7.在App.Config(本实例是一个Wpf项目)代码:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="PositionConfig" type="WpfApp25.PositionConfigurationSection,WpfApp25"/>
  </configSections>
  <PositionConfig>
    <Positions>
      <Position ID="0" Title="0">
        <Blocks>
          <Block ID="0" Title="0" X="0.0" Y="0.0" Width="50.0" Height="50.0"/>
          <Block ID="1" Title="1" X="60.0" Y="60.0" Width="50.0" Height="50.0"/>
        </Blocks>
      </Position>
      <Position ID="1" Title="1">
        <Blocks>
          <Block ID="0" Title="0" X="0.0" Y="0.0" Width="50.0" Height="50.0"/>
          <Block ID="1" Title="1" X="60.0" Y="60.0" Width="50.0" Height="50.0"/>
        </Blocks>
      </Position>
    </Positions>
  </PositionConfig>

  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
  </startup>
</configuration>

8.在App.Xaml.cs里面写测试代码:

  protected override void OnStartup(StartupEventArgs e)
        {
            PositionConfigurationSection section = ConfigurationManager.GetSection("PositionConfig") as PositionConfigurationSection;
            foreach (PositionSection position in section.Positions)
            {
                foreach (BlockSection block in position.Blocks)
                {

                }
            }
            base.OnStartup(e);
        }

总结:该实例演示的是通过配置文件来决定系统有哪些席位(PositionSection),席位里面包含哪些区块(BlockSection),以及配置了每个区块的大小和位置。这个实例演示的内容基本上能够满足我们大部分情况下的使用要求了。值得注意的是这句代码:

[ConfigurationCollection(typeof(BlockSection), CollectionType = ConfigurationElementCollectionType.AddRemoveClearMap,AddItemName ="Block")]

这句AddItemName ="Block",如果不写,系统默认的是add,这里面为了让xmal可读性更高些,把添加item的名字改掉了。

<section name="PositionConfig" type="WpfApp25.PositionConfigurationSection,WpfApp25"/>这一句里面的WpfApp25是我的测试项目名称。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值