自定义配置部分 - 删除不需要的集合标记

时间:2013-02-05 16:38:52

标签: c# .net configuration

我在app.config中为自定义嵌套配置集创建了自己的一组类。您可以在下面看到我必须使用的当前配置。我想知道的是如何修改我的类,以便我不需要AutoSyncConfiguration和WatchedFolders元素。我希望我的结果配置部分看起来像这样:

<custom>
  <BackupLocation Name="S3" Details="AccessKey=asdf;SecretKey=asdf;BucketName=asdf">
    <WatchedFolder Name="test1" LocalFolder="C" RemoteFolder="Z" FileSpec="*"></WatchedFolder>
    <WatchedFolder Name="test2" LocalFolder="D" RemoteFolder="X" FileSpec="*.doc"></WatchedFolder>
  </BackupLocation>
  <BackupLocation Name="External" Details="MappedDrive=X;">
    <WatchedFolder Name="test" LocalFolder="D" RemoteFolder="XPhotos" FileSpec="*.jpeg"></WatchedFolder>
  </BackupLocation>
</custom>

以下是我的课程,app.config的相关部分以及获取自定义配置的代码行:

public class Custom : ConfigurationSection
{
    [ConfigurationProperty("AutoSyncConfiguration")]
    public BackupLocationElementCollection AutoSyncConfiguration
    {
        get { return this["AutoSyncConfiguration"] as BackupLocationElementCollection; }
    }
}
public class BackupLocationElementCollection : ConfigurationElementCollection
{
    protected override ConfigurationElement CreateNewElement()
    {
        return new BackupLocationElement();
    }
    protected override object GetElementKey(ConfigurationElement element)
    {
        return ((BackupLocationElement)element).Name;
    }
    public override ConfigurationElementCollectionType CollectionType
    {
        get { return ConfigurationElementCollectionType.BasicMap; }
    }
    protected override string ElementName
    {
        get { return "BackupLocation"; }
    }
    public BackupLocationElement this[int index]
    {
        get { return (BackupLocationElement)BaseGet(index); }
        set
        {
            if (BaseGet(index) != null)
            {
                BaseRemoveAt(index);
            }
            BaseAdd(index, value);
        }
    }
    new public BackupLocationElement this[string backupName]
    {
        get { return (BackupLocationElement)BaseGet(backupName); }
    }
    public bool ContainsKey(string key)
    {
        bool result = false;
        object[] keys = BaseGetAllKeys();
        foreach (object obj in keys)
        {
            if ((string)obj == key)
            {
                result = true;
                break;
            }
        }
        return result;
    }
}

public class BackupLocationElement : ConfigurationElement
{
    [ConfigurationProperty("Name", IsRequired = true, IsKey = true)]
    public string Name
    {
        get { return this["Name"] as string; }
        set { this["Name"] = value; }
    }

    [ConfigurationProperty("Details", IsRequired = true, IsKey = false)]
    public string Details
    {
        get { return this["Details"] as string; }
        set { this["Details"] = value; }
    }

    [ConfigurationProperty("WatchedFolders")]
    public WatchedFolderElementCollection WatchedFolders
    {
        get { return this["WatchedFolders"] as WatchedFolderElementCollection; }
    }
}

public class WatchedFolderElementCollection : ConfigurationElementCollection
{
    protected override ConfigurationElement CreateNewElement()
    {
        return new WatchedFolderElement();
    }
    protected override object GetElementKey(ConfigurationElement element)
    {
        return ((WatchedFolderElement)element).Name;
    }
    public override ConfigurationElementCollectionType CollectionType
    {
        get { return ConfigurationElementCollectionType.BasicMap; }
    }
    protected override string ElementName
    {
        get { return "WatchedFolder"; }
    }
    public WatchedFolderElement this[int index]
    {
        get { return (WatchedFolderElement)BaseGet(index); }
        set
        {
            if (BaseGet(index) != null)
            {
                BaseRemoveAt(index);
            }
            BaseAdd(index, value);
        }
    }
    new public WatchedFolderElement this[string folderName]
    {
        get { return (WatchedFolderElement)BaseGet(folderName); }
    }
    public bool ContainsKey(string key)
    {
        bool result = false;
        object[] keys = BaseGetAllKeys();
        foreach (object obj in keys)
        {
            if ((string)obj == key)
            {
                result = true;
                break;
            }
        }
        return result;
    }
}

public class WatchedFolderElement : ConfigurationElement
{
    [ConfigurationProperty("Name", IsRequired = true, IsKey = true)]
    public string Name
    {
        get { return this["Name"] as string; }
        set { this["Name"] = value; }
    }

    [ConfigurationProperty("LocalFolder", IsRequired = true, IsKey = false)]
    public string LocalFolder
    {
        get { return this["LocalFolder"] as string; }
        set { this["LocalFolder"] = value; }
    }

    [ConfigurationProperty("RemoteFolder", IsRequired = true, IsKey = false)]
    public string RemoteFolder
    {
        get { return this["RemoteFolder"] as string; }
        set { this["RemoteFolder"] = value; }
    }

    [ConfigurationProperty("FileSpec", IsRequired = true, IsKey = false)]
    public string FileSpec
    {
        get { return this["FileSpec"] as string; }
        set { this["FileSpec"] = value; }
    }
}

以下是我的app.config:

<configuration>
  <configSections>
    <section name="custom" type="AutoSync.Custom, AutoSync" />
  </configSections>

  <custom>
    <AutoSyncConfiguration>
      <BackupLocation Name="S3" Details="AccessKey=asdf;SecretKey=asdf;BucketName=asdf">
        <WatchedFolders>
            <WatchedFolder Name="test1" LocalFolder="C" RemoteFolder="Z" FileSpec="*"/>
        </WatchedFolders>
      </BackupLocation>
      <BackupLocation Name="External" Details="MappedDrive=X;">
        <WatchedFolders>
            <WatchedFolder Name="test" LocalFolder="D" RemoteFolder="XPhotos" FileSpec="*.jpeg" />
        </WatchedFolders>
      </BackupLocation>
    </AutoSyncConfiguration>
  </custom>
</configuration>

我的代码如下:

Custom config = (Custom)ConfigurationManager.GetSection("custom");

有人可以告诉我如何成功折叠我的配置部分以摆脱“未使用的”元素吗?

1 个答案:

答案 0 :(得分:1)

我不知道如何通过简单地添加一两行代码来完成它,因为它只是.NET配置如何序列化/反序列化集合。一种解决方案可能是 - 创建自己的类型转换器 - ConfigurationConverterBase的后代。将其应用于您的AutoSyncConfiguration财产。在转换器中执行您想要序列化/反序列化集合的任何内容。