【问题标题】:Custom Configuration Section - Remove unwanted collection tags自定义配置部分 - 删除不需要的集合标签
【发布时间】:2016-12-31 23:19:07
【问题描述】:

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

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

【问题讨论】:

    标签: c# .net configuration


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2011-11-04
      • 2011-09-16
      • 2012-11-04
      • 2019-07-28
      • 1970-01-01
      • 1970-01-01
      • 2013-10-31
      • 2012-02-20
      • 2010-10-25
      相关资源
      最近更新 更多