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

本文关键字:集合 不需要 删除 配置部 自定义 | 更新日期: 2023-09-27 17:57:52

我在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");

有人能告诉我如何成功地折叠我的配置部分以清除"未使用"的元素吗?

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

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