技术人写博客,真是应该,这个自定义配置节很早以前就做了,但现在项目中又要用到了,以前的错误还是会犯,今天还是把这些都记下来吧。c#中的自定义配置节主要是由以下几个类来实现的:ConfigurationSection,ConfigurationElementCollection和ConfigurationElement,层次也很清楚。ConfigurationSection就是最上导的节点。放在
<configSections>
<section name="" type="" />
</configSections>
里,其中name就是节点的名称,type里就是以“程序所在完整路径,程序集名”。
ConfigurationElementCollection和ConfigurationElement就是管下面真正的配置了。多话不说了,贴上我的测试代码吧!
namespace Test { class TestSection : ConfigurationSection { [ConfigurationProperty("columns", IsRequired = true)] public ColumnElements Columns { get { return this["columns"] as ColumnElements; } private set{} } [ConfigurationProperty("times", IsRequired = true)] public string Times { get { return this["times"] as string; } private set { } } } }
namespace Test { public class ColumnElements : ConfigurationElementCollection { //public ColumnElements() //{ // return new ColumnElement(); //} #region 基类方法重载 protected override ConfigurationElement CreateNewElement() { return new ColumnElement(); } protected override object GetElementKey(ConfigurationElement element) { return (element as ColumnElement).Name; } public new ColumnElement this[string name] { get { return BaseGet(name) as ColumnElement; } } public new ColumnElement this[int index] { get { return BaseGet(index) as ColumnElement; } } protected override string ElementName { get { return "column"; } } public override ConfigurationElementCollectionType CollectionType { get { return ConfigurationElementCollectionType.BasicMap; } } #endregion #region 私有方法 #endregion } }
namespace Test { public class ColumnElement : ConfigurationElement { #region 字段和属性 [ConfigurationProperty("name", IsRequired = true)] public string Name { get { return this["name"] as string; } private set{} } [ConfigurationProperty("type", IsRequired = true)] public string Type { get { return this["type"] as string; } private set{} } [ConfigurationProperty("length", IsRequired = false)] public int? Length { get { return (int?)this["length"]; } private set{} } #endregion } }
最后一定要提醒的是:ConfigurationElementCollection的子类里必须要实现CollectionType方法和ElementName属性啊,不然肯定会出错了,切记啊!