自定义配置部分-删除不需要的集合标记
本文关键字:集合 不需要 删除 配置部 自定义 | 更新日期: 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
属性。在转换器中,执行任何您想要序列化/反序列化集合的操作。