我创建了我的第一个自定义配置部分,一切顺利。然后我去扩展它,它横着走了。我遇到的问题很多,并且无法找到很多例子,在我的部分内部,我希望有两种不同类型的集合。两个集合中的元素完全不同,但每个元素都相同。当我收到错误时,我无法让配置部分返回正确的Collection。我可以作弊并创建2个部分,但这似乎不是实现此目的的正确方法。
确定一些代码
<configSections>
<section name="MyFileSection" type="My.ConfigManager.MyFileListConfiguration, MyConfigManager" />
</configSections>
<MyFileSection>
<MyDirectoryRootCollection>
<add rootName="MyDataLocation" rootLocation="\\MyServer\MyDirectory"/>
<add rootName="YourDataLocation" rootLocation="\\YourServer\YourDirectory"/>
</MyDirectoryRootCollection>
<MyFileListCollection>
<add keyName="MyFile1" copyType="File" sourceFileName="TestFile1" />
<add keyName="MyFile2" copyType="FTP" sourceFileName="TestFile2" />
<add keyName="MyFile3" copyType="File" sourceFileName="TestFile3" />
</MyFileListCollection>
</MyFileSection>
所以在MyFileSection中,我有2个集合...... MyDirectoryRootCollection和MyFileListCollection。我认为一个Config课程会让我得到他们中的两个。
namespace My.ConfigManager
{
public class MyFileListConfiguration : ConfigurationSection
{
private static string sMyFileListCollectionConst = "MyFileListCollection";
private static string sMyDirectoryRootCollectionConst = "MyDirectoryRootCollection";
[ConfigurationProperty("MyFileListCollection", IsDefaultCollection = false)]
[ConfigurationCollection(typeof(MyFileListConfigEleCollection), AddItemName = "MyFileListCollection")]
public MyFileListConfigEleCollection MyFileListCollection
{
get { return ((MyFileListConfigEleCollection)(base["MyFileListCollection"])); }
}
[ConfigurationProperty("MyDirectoryRootCollection", IsDefaultCollection = false)]
[ConfigurationCollection(typeof(MyDirectoryRootConfigEleCollection), AddItemName = "MyFileListCollection")]
public MyFileListConfiguration MyDirectoryRoot
{
get { return ((MyFileListConfiguration)(base["MyDirectoryRootCollection"])); }
}
}
我尝试使用此调用获取配置部分
MyFileListConfiguration fileListSection = (MyFileListConfiguration)ConfigurationManager.GetSection("MyFileSection");
但是我得到了这个错误 -
System.Configuration.ConfigurationErrorsException未处理
Message =“配置属性'MyDirectoryRootCollection'可以 不是从ConfigurationSection派生的。“
有没有人知道我做错了什么,是否有可能在一个部分内有2个完全不同的集合?
答案 0 :(得分:3)
这应该适合你。
<强>用法:强>
MyFileListConfiguration myConfig = (MyFileListConfiguration)ConfigurationManager.GetSection("MyFileSection");
myConfig.Files[0] or myConfig.Files["MyFile1"] => .KeyName / .CopyType / .SourceFileName
// myConfig.Directories[0] or myConfig.Directories["MyDataLocation"] => .RootName / .RootLocation
public class MyFileListConfiguration : ConfigurationSection
{
[ConfigurationProperty("MyFileListCollection", IsDefaultCollection = false)]
public MyFileListCollection Files
{
get { return ((MyFileListCollection)(base["MyFileListCollection"])); }
}
[ConfigurationProperty("MyDirectoryRootCollection", IsDefaultCollection = false)]
public MyDirCollection Directories
{
get { return ((MyDirCollection)(base["MyDirectoryRootCollection"])); }
}
}
[ConfigurationCollection(typeof(MyFileElement))]
public class MyFileListCollection : ConfigurationElementCollection
{
protected override ConfigurationElement CreateNewElement()
{
return new MyFileElement();
}
protected override object GetElementKey(ConfigurationElement element)
{
return ((MyFileElement)(element)).KeyName;
}
/// <summary>
/// Access the collection by index
/// </summary>
/// <param name="index"></param>
/// <returns></returns>
public MyFileElement this[int index]
{
get { return (MyFileElement)BaseGet(index); }
}
/// <summary>
/// Access the collection by key name
/// </summary>
/// <param name="key"></param>
/// <returns></returns>
public new MyFileElement this[string key]
{
get { return (MyFileElement)BaseGet(key); }
}
}
[ConfigurationCollection(typeof(MyDirElement))]
public class MyDirCollection : ConfigurationElementCollection
{
protected override ConfigurationElement CreateNewElement()
{
return new MyDirElement();
}
protected override object GetElementKey(ConfigurationElement element)
{
return ((MyDirElement)(element)).RootName;
}
/// <summary>
/// Access the collection by index
/// </summary>
/// <param name="index"></param>
/// <returns></returns>
public MyDirElement this[int index]
{
get { return (MyDirElement)BaseGet(index); }
}
/// <summary>
/// Access the collection by key name
/// </summary>
/// <param name="key"></param>
/// <returns></returns>
public new MyDirElement this[string key]
{
get { return (MyDirElement)BaseGet(key); }
}
}
public class MyFileElement : ConfigurationElement
{
[ConfigurationProperty("keyName", DefaultValue = "", IsKey = true, IsRequired = true)]
public string KeyName
{
get { return ((string)(base["keyName"])); }
set { base["keyName"] = value; }
}
[ConfigurationProperty("copyType", DefaultValue = "")]
public string CopyType
{
get { return ((string)(base["copyType"])); }
set { base["copyType"] = value; }
}
[ConfigurationProperty("sourceFileName", DefaultValue = "")]
public string SourceFileName
{
get { return ((string)(base["sourceFileName"])); }
set { base["sourceFileName"] = value; }
}
}
public class MyDirElement : ConfigurationElement
{
[ConfigurationProperty("rootName", DefaultValue = "", IsKey = true, IsRequired = true)]
public string RootName
{
get { return ((string)(base["rootName"])); }
set { base["rootName"] = value; }
}
[ConfigurationProperty("rootLocation", DefaultValue = "")]
public string RootLocation
{
get { return ((string)(base["rootLocation"])); }
set { base["rootLocation"] = value; }
}
}
答案 1 :(得分:0)
MyDirectoryRoot属性的类型应该是MyDirectoryRootConfigEleCollection而不是MyFileListConfiguration。请注意,添加元素名称应为“添加”以匹配您的示例http://msdn.microsoft.com/en-us/library/system.configuration.configurationcollectionattribute.configurationcollectionattribute.aspx