西峡华扬电子 發表於 2022-5-1 11:46:00

C#自定义配置文件(一)

<h1 id="c自定义配置文件">C#自定义配置文件</h1>
<blockquote>
<p>.NET程序中,经常使用Config文件来配置应用程序中经常使用的值,比如数据库连接字符串。最近项目遇到一个需要配置好多节点在配置文件中的需求。为了使配置节点整洁易维护,在代码调用时也保证获取时比较直观,结合自定义配置文件专门整理了一个配置文件帮助类Demo。此篇文章主要讲述自定义配置文件的使用方法。</p>
</blockquote>
<hr>
<h3 id="常见配置文件使用方法">常见配置文件使用方法</h3>
<ul>
<li>直接在connectionStrings\appSettings这两个节点中添加add节点配置
<ul>
<li>这种方式在项目中很常见,使用简单,这里不做介绍</li>
</ul>
</li>
<li>文件操作
<ul>
<li>很多程序中(自己公司老项目),通过获取指定路径下XML\ini\json\txt等文件,通过IO获取文件内容并对文件进行解析,从而获取程序需要的配置信息(不推荐)</li>
</ul>
</li>
</ul>
<h3 id="自定义配置文件">自定义配置文件</h3>
<p>在App.Config(web.config)中指定其他配置文件的路径和节点。<br>
在configSections节点下配置section节点,.NET提供自带的类型进行封装。(NameValue键值对、Dictionary字典、SingTag基础结构)。Section节点的name属性是自定义节点的名称,type是接收信息的数据类型。<br>
<strong>注意!configSections节点必须为configuration下第一个节点</strong></p>
<blockquote>
<p><kbd>configSections</kbd>的<kbd>name</kbd>属性为自定义配置节点的名称,<kbd>type<kbd> 为转换的类型</kbd></kbd></p>
<p><code>ConfigurationManager.GetSection("name")</code> 方法的参数是自定义配置文件节点的名称</p>
</blockquote>
<h4 id="namevalue键值对">NameValue键值对</h4>
<p>配置语法格式:</p>
<pre><code class="language-XML">&lt;?xml version="1.0" encoding="utf-8" ?&gt;
&lt;configuration&gt;
        &lt;configSections&gt;
                &lt;!--以NameValueCollection键值对的形式返回配置节点中的信息,type值固定为System.Configuration.NameValueSectionHandler--&gt;
                &lt;section name="NameValueConfigNode" type="System.Configuration.NameValueSectionHandler"/&gt;
        &lt;/configSections&gt;
        &lt;!--自定义配置节点--&gt;
        &lt;NameValueConfigNode&gt;
                &lt;add key="Name一" value="Value一" /&gt;
                &lt;add key="Name二" value="Value二" /&gt;
                &lt;add key="Name三" value="Value三" /&gt;
        &lt;/NameValueConfigNode&gt;
    &lt;startup&gt;
      &lt;supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8" /&gt;
    &lt;/startup&gt;
&lt;/configuration&gt;
</code></pre>
<p>调用方法:这里以一个静态属性的方法获取并返回Dictionary格式(后面几种方法也采用这个方式)</p>
<pre><code class="language-CSharp">/// &lt;summary&gt;
/// NameValueCollection
/// &lt;/summary&gt;
public static Dictionary&lt;string, string&gt; NameValueConfigNode
{
    get
    {
      NameValueCollection nvc = (NameValueCollection)ConfigurationManager.GetSection("NameValueConfigNode");
      Dictionary&lt;string, string&gt; result = new Dictionary&lt;string,string&gt;();
         foreach (string key in nvc.AllKeys)
      {
            result.Add(key, nvc);
      }
      return result;
    }
}
</code></pre>
<h4 id="dictionary">Dictionary</h4>
<p>配置文件语法格式:</p>
<pre><code class="language-XML">&lt;?xml version="1.0" encoding="utf-8" ?&gt;
&lt;configuration&gt;
        &lt;configSections&gt;
                &lt;!--以Dictionary字典的形式返回配置节点中的信息,type固定为System.Configuration.DictionarySectionHandler--&gt;
                &lt;section name="DictionaryConfigNode" type="System.Configuration.DictionarySectionHandler"/&gt;
        &lt;/configSections&gt;
        &lt;!--自定义配置节点--&gt;
        &lt;DictionaryConfigNode&gt;
                &lt;add key="Key一" value="DictValue一" /&gt;
                &lt;add key="Key二" value="DictValue二" /&gt;
                &lt;add key="Key三" value="DictValue三" /&gt;
        &lt;/DictionaryConfigNode&gt;
    &lt;startup&gt;
      &lt;supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8" /&gt;
    &lt;/startup&gt;
&lt;/configuration&gt;
</code></pre>
<p>调用方法:</p>
<pre><code class="language-CSharp">/// &lt;summary&gt;
/// Dictionary
/// &lt;/summary&gt;
public static Dictionary&lt;string, string&gt; DictionaryConfigNode
{
    get
    {
      IDictionary dict = (IDictionary)ConfigurationManager.GetSection("DictionaryConfigNode");
      Dictionary&lt;string, string&gt; result = new Dictionary&lt;string, string&gt;();
      foreach (string key in dict.Keys)
      {
            result.Add(key, dict.ToString());
      }
      return result;
    }
}
</code></pre>
<h4 id="singtag">SingTag</h4>
<p>配置文件语法格式:</p>
<pre><code class="language-XML">&lt;?xml version="1.0" encoding="utf-8" ?&gt;
&lt;configuration&gt;
        &lt;configSections&gt;
                &lt;!--基础结构处理 .config 文件中由单个 XML 标记所表示的各配置节点中的值,type固定为System.Configuration.SingleTagSectionHandler--&gt;
                &lt;section name="SingleTagConfigNode" type="System.Configuration.SingleTagSectionHandler" /&gt;
        &lt;/configSections&gt;
        &lt;!--自定义配置节点--&gt;
        &lt;!--注意,只能是单个节SingleTagSectionHandler才能处理,无论有多少个属性都能处理--&gt;
        &lt;SingleTagConfigNode PropertyOne="1" PropertyTwo="2" PropertyThree="3" PropertyFour="4" PropertyFive="5" /&gt;
    &lt;startup&gt;
      &lt;supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8" /&gt;
    &lt;/startup&gt;
&lt;/configuration&gt;
</code></pre>
<p>调用方法:</p>
<pre><code class="language-CSharp">/// &lt;summary&gt;
/// SingleTag
/// &lt;/summary&gt;
public static Dictionary&lt;string, string&gt; SingleTagConfigNode
{
    get
    {
      Hashtable dict = (Hashtable)ConfigurationManager.GetSection("SingleTagConfigNode");
      Dictionary&lt;string, string&gt; result = new Dictionary&lt;string, string&gt;();
      foreach (string key in dict.Keys)
      {
            result.Add(key, dict.ToString());
      }
      return result;
    }
}
</code></pre>
<p><font color="red">以上程序通过控制台应用程序测试调用效果如下:</font></p>
<p><img src="https://s1.ax1x.com/2022/04/20/Lsbv5T.png"></p>
<h4 id="自定义配置文件-1">自定义配置文件</h4>
<p>以上三种方法,只能读取应用程序的Web.config或者app.config中的配置信息,但是在大多数项目中,业务场景复杂,配置信息更是多到看不过来,所以如果都写在web.config或者app.config中的话,不太美观,也不易维护。</p>
<p>那么有没有一种方法,可以根据需要,配置一个或者多个的config,并且在程序中直接调用使用的方法?   <code>(问就是有^_^)</code></p>
<p>下面举例一种自定义配置文件的写法<br>
配置文件写法:<br>
<kbd>&lt;configSections&gt;</kbd>节点下<kbd>&lt;section&gt;</kbd>的属性值内容与上面三个方法相同。需要注意的是自定义节点,自定义节点只需要设置configSource属性即可,属性值指向自定义配置文件的路径;<br>
<font color="red">注意:路径必须要写成相对路径。</font></p>
<pre><code class="language-XML">&lt;?xml version="1.0" encoding="utf-8" ?&gt;
&lt;configuration&gt;
        &lt;configSections&gt;
                &lt;!--把MyConfigData节点的数据映射到MyConfigData类中--&gt;
                &lt;section name="MyConfigData" type="ConsoleApplication.ConfigFiles.ConfigFile,ConsoleApplication"/&gt;
        &lt;/configSections&gt;
        &lt;!--自定义配置节点,configSource指定自定义配置文件的路径(必须是相对路径)--&gt;
        &lt;MyConfigData configSource="ConfigFiles\Framework.config"/&gt;
    &lt;startup&gt;
      &lt;supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8" /&gt;
    &lt;/startup&gt;
&lt;/configuration&gt;

</code></pre>
<p>这是自定义的文件内容,</p>
<pre><code class="language-XML">&lt;?xml version="1.0" encoding="utf-8" ?&gt;
&lt;MyConfigData&gt;
        &lt;add key="Key一" value="自定义文件一" /&gt;
        &lt;add key="Key二" value="自定义文件二" /&gt;
        &lt;add key="Key三" value="自定义文件三" /&gt;
&lt;/MyConfigData&gt;
</code></pre>
<p><font color="DarkGreen">程序中的调用方法与上面的方式一致,这种自定义配置文件的精髓在于,不用将所有配置信息都挤在一个文件中,而是根据项目需要合理的分成多个配置,只需要在web.config或者app.config中指定文件路径即可。其他使用方法没有差别</font></p>
<h4 id="自定义结构配置文件">自定义结构配置文件</h4>
<p>以上方法为常用的基本配置文件的使用方法,都是使用C#提供的类型进行获取,配置文件的节点需要按照对应格式设置,C#中还有一种可以自定义配置文件格式的调用方法,Config中科自定义节点的结构,然后在程序中需要自定义一个配置文件的类,用于接收自定义配置文件的内容;<br>
其中使用到的类型:<br>
ConfigurationSection、ConfigurationElementCollection、ConfigurationElement、ConfigurationProperty<br>
上面介绍的几种方法基本上已经足够日常使用,此篇文章不在进行介绍自定义格式的写法,后期会根据个人情况(是否懒惰的情况),可能会补充此部分功能,有兴趣可以去了解一下。</p>
<h3 id="写在最后">写在最后</h3>
<p>以上源代码已经放在Gitee上,可自行下载,<br>
https://gitee.com/yang-yong-666/csharp<br>
该项目还包含其他关于C#的帮助类,并且会持续更新!</p>
<hr>
<p><em>个人交流QQ:1695690324</em><br>
<em><strong>原创不易,转载请注明出处</strong></em><br>
<em>博客园:https://www.cnblogs.com/yangyongdashen-S/</em><br>
<em>CSDN:https://blog.csdn.net/weixin_44312699?spm=1010.2135.3001.5343</em><br>
<em>Gitee:https://gitee.com/yang-yong-666</em><br>
<em>公众号:yi人夕岸</em></p><br><br>
来源:https://www.cnblogs.com/yangyongdashen-S/p/YiRenXiAn_CSharp_Config_1.html
頁: [1]
查看完整版本: C#自定义配置文件(一)