Create a custom configSection in web.config or app.config file
config file:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="FileDepend" type="TestConsole.FileDepend,TestConsole"/>
</configSections>
<FileDepend>
<RootDir path="c:\"></RootDir>
<Public>
<element file="/1.txt"></element>
<element file="/2.txt"></element>
</Public>
<Modules>
<module name="legend">
<element file="/3.txt"></element>
<element file="/4.txt"></element>
</module>
<module name="bookmark">
<element file="/5.txt"></element>
<element file="/6.txt"></element>
</module>
</Modules>
</FileDepend>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6" />
</startup>
</configuration>
FileDepend.cs
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
namespace TestConsole
{
public class FileDepend : ConfigurationSection
{
[ConfigurationProperty("RootDir")]
private RootDirElement _RootDir => (RootDirElement)base["RootDir"];
[ConfigurationProperty("Public")]
private FilesCollection PublicFilesCollection => ((FilesCollection)(base["Public"]));
public string RootDir => _RootDir.Name;
[ConfigurationProperty("Modules")]
public ModulesCollection ModulesCollection => ((ModulesCollection)(base["Modules"]));
public IEnumerable<string> PublicFiles => from FileElement v in PublicFilesCollection select v.Name;
}
public class RootDirElement : ConfigurationElement
{
[ConfigurationProperty("path", DefaultValue = "", IsKey = true, IsRequired = true)]
public string Name => (string)base["path"];
}
public class FileElement : ConfigurationElement
{
[ConfigurationProperty("file", DefaultValue = "", IsKey = true, IsRequired = true)]
public string Name => (string)base["file"];
}
public class ModuleElement : ConfigurationElement
{
[ConfigurationProperty("name", DefaultValue = "", IsKey = true, IsRequired = true)]
public string Name
{
get { return (string)base["name"]; }
set { base["name"] = value; }
}
[ConfigurationProperty("", IsDefaultCollection = true)]
private FilesCollection Element => (FilesCollection)base[""];
public IEnumerable<string> Files => from FileElement file in Element select file.Name;
}
[ConfigurationCollection(typeof(ModuleElement))]
public class FilesCollection : ConfigurationElementCollection
{
internal const string PropertyName = "element";
public override ConfigurationElementCollectionType CollectionType => ConfigurationElementCollectionType.BasicMapAlternate;
protected override string ElementName => PropertyName;
protected override bool IsElementName(string elementName)
{
return elementName.Equals(PropertyName, StringComparison.InvariantCultureIgnoreCase);
}
public override bool IsReadOnly()
{
return false;
}
protected override ConfigurationElement CreateNewElement()
{
return new FileElement();
}
protected override object GetElementKey(ConfigurationElement element)
{
return ((FileElement)(element)).Name;
}
public FileElement this[int idx] => (FileElement)BaseGet(idx);
public new FileElement this[string idx] => (FileElement)BaseGet(idx);
}
[ConfigurationCollection(typeof(ModuleElement))]
public class ModulesCollection : ConfigurationElementCollection
{
internal const string PropertyName = "module";
public override ConfigurationElementCollectionType CollectionType => ConfigurationElementCollectionType.BasicMapAlternate;
protected override string ElementName => PropertyName;
protected override bool IsElementName(string elementName)
{
return elementName.Equals(PropertyName, StringComparison.InvariantCultureIgnoreCase);
}
public override bool IsReadOnly()
{
return false;
}
protected override ConfigurationElement CreateNewElement()
{
return new ModuleElement();
}
protected override object GetElementKey(ConfigurationElement element)
{
return ((ModuleElement)(element)).Name;
}
public ModuleElement this[int idx] => (ModuleElement)BaseGet(idx);
public new ModuleElement this[string idx] => (ModuleElement)BaseGet(idx);
}
}
run:
static void Main(string[] args)
{
var v = ConfigurationManager.GetSection("FileDepend") as FileDepend;
var rootDir = v.RootDir;
var publicFiles = v.PublicFiles;
var legendFiles = v.ModulesCollection["legend"].Files;
Console.WriteLine(rootDir);
publicFiles.ToList().ForEach(Console.WriteLine);
legendFiles.ToList().ForEach(Console.WriteLine);
Console.ReadLine();
}
Create a custom configSection in web.config or app.config file的更多相关文章
- 说说Web.Config与App.Config
说到web.config和app.config大家都很熟悉,我们都叫他们配置文件,平时用的多,注意的少.两个有啥区别呢,很简单,一句话:如果是web程序,如webform项目类型和mvc项目类型就是w ...
- 在Web.config或App.config中的添加自定义配置
.Net中的System.Configuration命名空间为我们在web.config或者app.config中自定义配置提供了完美的支持.最近看到一些项目中还在自定义xml文件做程序的配置,所以忍 ...
- 修改和获取web.config或app.config文件appSettings配置节中的Add里的value属性 函数
1: /// <summary> 2: /// 修改web.config或app.config文件appSettings配置节中的Add里的value属性 3: /// </summ ...
- .NET下对Web.config与App.Config的增删改操作的代码
把代码过程常用的内容做个收藏,下边代码段是关于 .NET下对Web.config与App.Config的增删改操作的代码. <?xml version="1.0" encod ...
- 在Web.config或App.config中的添加自定义配置 <转>
.Net中的System.Configuration命名空间为我们在web.config或者app.config中自定义配置提供了完美的支持.最近看到一些项目中还在自定义xml文件做程序的配置 ...
- 一个web.Config或app.Config自定义段configSections的示例
一个web.Config或app.Config自定义段configSections的示例 越来越觉得,直接用配置文件app.Config或web.Config配置应用系统的运行参数,比自己做一个xml ...
- .net分布在指定文件夹的web.confgi或者app.config
.Net里面,ConfigurationManager默认读取的是Web.config或者App.config但是,什么都放在这两个文件里面,感觉太多了,也不好管理配置.于是参考了下别人的资料,自己写 ...
- 一个web.Config或app.Config自定义段configSections的示例--转
直接用配置文件app.Config或web.Config配置应用系统的运行参数,比自己做一个xml配置文件,简洁方便得多.这两个配置文件不仅有常见的connectionStrings和appSetti ...
- 配置文件(Machine.config、Web.config、App.config)
Machine.config1.该文件在Windows目录下\Microsoft.net\framework\[version]\Config\2.为了提高性能,该文件只包含不同于默认值的设置.并且定 ...
随机推荐
- android中onStartActivityForResult无返回值问题
在activity间跳转传递参数,常见方法是通过onStartActivityForResult来做.不过今天使用 onStartActivityForResult的时候已经在上一个activity调 ...
- 快速美眉(FastMM)使用手记
今天在SourceForge下到了FastMM (Fast Memory Manager),听说比官方的内存管理快多了,试了一下,果然不错.目前最新的是4.27. 就我的使用范围来说,我就是想看看我的 ...
- 利用指针突破C++编译器的防线
C++ 面向对象的一大特性就是封装,使用不同的访问控制符来控制外接对其的访问权限.比如: class A { public: A(): i(){} void print(){ cout << ...
- #include <vector>
双端队列deque比向量vector更有优势 vector是动态数组,在堆上 vector比array更常用 不需要变长,容量较小,用array 需要变长,容量较大,用vector 1 at() 取出 ...
- 【转】python import的用法
[转自http://blog.sina.com.cn/s/blog_4b5039210100ennq.html] 在python用import或者from...import来导入相应的模块.模块其实就 ...
- cocos2d-x创建场景
今天开始学习Cocos2d-x,使用的版本是2.1.4,这个版本比较老,对应的参考资料也比较齐全. 在mac/xcode环境下,代码是写在Classes文件夹下的,和iOS应用类似,程序从AppDel ...
- lucene定义自己的分词器将其分成单个字符
问题描写叙述:将一句话拆分成单个字符.而且去掉空格. package com.mylucene; import java.io.IOException; import java.io.Reader; ...
- Python文件或目录操作的常用函数
◆ os.listdir(path) Return a list containing the names of the entries in the directory given by path. ...
- openvswitch安装、基本操作
一.安装,配置 //下载源码.编译.安装: #wget http://openvswitch.org/releases/openvswitch-2.3.0.tar.gz #tar -zxvf open ...
- Java String.indexOf() 函数用法小结
1. indexOf的参数是 String, startIndex: Number; indexOf的返回值为int, 2. Function indexOf 包含如下几个格式:1). Strng. ...