如何在ConfigurationElementCollection中拥有自定义属性?

joj*_*ojo 26 c# configuration-files .net-4.0

配置如下

<MyCollection default="one">
  <entry name="one" ... other attrubutes />
  ... other entries
</MyCollection>
Run Code Online (Sandbox Code Playgroud)

实现MyCollection时,我该怎么做"默认"属性?

Sim*_*ier 55

假设你有这个.config文件:

<configuration>
    <configSections>
        <section name="mySection" type="ConsoleApplication1.MySection, ConsoleApplication1" /> // update type  & assembly names accordingly
    </configSections>

    <mySection>
        <MyCollection default="one">
            <entry name="one" />
            <entry name="two" />
        </MyCollection>
    </mySection>
</configuration>
Run Code Online (Sandbox Code Playgroud)

然后,使用此代码:

public class MySection : ConfigurationSection
{
    [ConfigurationProperty("MyCollection", Options = ConfigurationPropertyOptions.IsRequired)]
    public MyCollection MyCollection
    {
        get
        {
            return (MyCollection)this["MyCollection"];
        }
    }
}

[ConfigurationCollection(typeof(EntryElement), AddItemName = "entry", CollectionType = ConfigurationElementCollectionType.BasicMap)]
public class MyCollection : ConfigurationElementCollection
{
    protected override ConfigurationElement CreateNewElement()
    {
        return new EntryElement();
    }

    protected override object GetElementKey(ConfigurationElement element)
    {
        if (element == null)
            throw new ArgumentNullException("element");

        return ((EntryElement)element).Name;
    }

    [ConfigurationProperty("default", IsRequired = false)]
    public string Default
    {
        get
        {
            return (string)base["default"];
        }
    }
}

public class EntryElement : ConfigurationElement
{
    [ConfigurationProperty("name", IsRequired = true, IsKey = true)]
    public string Name
    {
        get
        {
            return (string)base["name"];
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以使用'default'属性读取配置,如下所示:

    MySection section = (MySection)ConfigurationManager.GetSection("mySection");
    Console.WriteLine(section.MyCollection.Default);
Run Code Online (Sandbox Code Playgroud)

这将输出"一个"

  • AddItemName =“ entry”,这正是我想要的! (2认同)

Fab*_*bio 5

我不知道是否可以在ConfigurationElementCollection中使用默认值.(它没有看到默认值的任何属性).

我想你必须自己实现这个.看下面的例子.

public class Repository : ConfigurationElement
{
    [ConfigurationProperty("key", IsRequired = true)]
    public string Key
    {
        get { return (string)this["key"]; }
    }

    [ConfigurationProperty("value", IsRequired = true)]
    public string Value
    {
        get { return (string)this["value"]; }
    }
}

public class RepositoryCollection : ConfigurationElementCollection
{
    protected override ConfigurationElement CreateNewElement()
    {
        return new Repository();
    }

    protected override object GetElementKey(ConfigurationElement element)
    {
        return (element as Repository).Key;
    }

    public Repository this[int index]
    {
        get { return base.BaseGet(index) as Repository; }
    }

    public new Repository this[string key]
    {
        get { return base.BaseGet(key) as Repository; }
    }

}

public class MyConfig : ConfigurationSection
{
    [ConfigurationProperty("currentRepository", IsRequired = true)]
    private string InternalCurrentRepository
    {
        get { return (string)this["currentRepository"]; }
    }

    [ConfigurationProperty("repositories", IsRequired = true)]
    private RepositoryCollection InternalRepositories
    {
        get { return this["repositories"] as RepositoryCollection; }
    }
}
Run Code Online (Sandbox Code Playgroud)

这是XML配置:

  <myConfig currentRepository="SQL2008">
    <repositories>
      <add key="SQL2008" value="abc"/>
      <add key="Oracle" value="xyz"/>
    </repositories>
  </myConfig>
Run Code Online (Sandbox Code Playgroud)

然后,在您的代码中,使用以下命令访问默认项:

MyConfig conf = (MyConfig)ConfigurationManager.GetSection("myConfig");
string myValue = conf.Repositories[conf.CurrentRepository].Value;
Run Code Online (Sandbox Code Playgroud)

当然,MyConfig类可以隐藏访问Repositories和CurrentRepository属性的详细信息.您可以在MyConfig类中拥有一个名为DefaultRepository(类型为Repository)的属性来返回此属性.