1. 程式人生 > >c#自定義配置節點(web.config、app.config)

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是我的測試專案名稱。