我在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");
有人可以告诉我如何成功折叠我的配置部分以摆脱“未使用的”元素吗?
答案 0 :(得分:1)
我不知道如何通过简单地添加一两行代码来完成它,因为它只是.NET配置如何序列化/反序列化集合。一种解决方案可能是 - 创建自己的类型转换器 - ConfigurationConverterBase
的后代。将其应用于您的AutoSyncConfiguration
财产。在转换器中执行您想要序列化/反序列化集合的任何内容。