原始问题和代码:Customized IEnumerable in ConfigurationSection
推进解决方案,并与@Daniel Hilgarth回答我已经改变了(app.config):
<section name="Disk"
type="ConsoleApplication1_ConfigurationEnumerable.PathsConfigSection"/>
到这一个:
<section name="Disk"
type="ConsoleApplication1_ConfigurationEnumerable.PathsConfigSection,
ConsoleApplication1_ConfigurationEnumerable"/>
现在,我有另一个例外:
System.Configuration.ConfigurationErrorsException was unhandled
HResult=-2146232062
Message=Unrecognized element 'Path'. (C:\Users\blackberry\Desktop\ConsoleApplication1_ConfigurationEnumerable\ConsoleApplication1_ConfigurationEnumerable\bin\Debug\ConsoleApplication1_ConfigurationEnumerable.vshost.exe.config line 9)
Source=System.Configuration
BareMessage=Unrecognized element 'Path'.
Filename=C:\Users\blackberry\Desktop\ConsoleApplication1_ConfigurationEnumerable\ConsoleApplication1_ConfigurationEnumerable\bin\Debug\ConsoleApplication1_ConfigurationEnumerable.vshost.exe.config
Line=9
StackTrace:
at System.Configuration.BaseConfigurationRecord.EvaluateOne(String[] keys, SectionInput input, Boolean isTrusted, FactoryRecord factoryRecord, SectionRecord sectionRecord, Object parentResult)
at System.Configuration.BaseConfigurationRecord.Evaluate(FactoryRecord factoryRecord, SectionRecord sectionRecord, Object parentResult, Boolean getLkg, Boolean getRuntimeObject, Object& result, Object& resultRuntimeObject)
at System.Configuration.BaseConfigurationRecord.GetSectionRecursive(String configKey, Boolean getLkg, Boolean checkPermission, Boolean getRuntimeObject, Boolean requestIsHere, Object& result, Object& resultRuntimeObject)
at System.Configuration.BaseConfigurationRecord.GetSectionRecursive(String configKey, Boolean getLkg, Boolean checkPermission, Boolean getRuntimeObject, Boolean requestIsHere, Object& result, Object& resultRuntimeObject)
at System.Configuration.BaseConfigurationRecord.GetSectionRecursive(String configKey, Boolean getLkg, Boolean checkPermission, Boolean getRuntimeObject, Boolean requestIsHere, Object& result, Object& resultRuntimeObject)
at System.Configuration.BaseConfigurationRecord.GetSection(String configKey)
at System.Configuration.ClientConfigurationSystem.System.Configuration.Internal.IInternalConfigSystem.GetSection(String sectionName)
at System.Configuration.ConfigurationManager.GetSection(String sectionName)
at ConsoleApplication1_ConfigurationEnumerable.PathsConfigSection.GetConfig() in C:\Users\blackberry\Desktop\ConsoleApplication1_ConfigurationEnumerable\ConsoleApplication1_ConfigurationEnumerable\Disk.cs:line 63
at ConsoleApplication1_ConfigurationEnumerable.Program.Main(String[] args) in C:\Users\blackberry\Desktop\ConsoleApplication1_ConfigurationEnumerable\ConsoleApplication1_ConfigurationEnumerable\Program.cs:line 9
at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()
InnerException:
答案 0 :(得分:1)
尝试将以下属性添加到PathsConfigSection.Paths
属性中:
[ConfigurationCollection(typeof(Paths), AddItemName = "Path")]
现在应该是这样的:
[ConfigurationProperty("Paths")]
[ConfigurationCollection(typeof(Paths), AddItemName = "Path")]
public Paths Paths
{
get
{
var o = this["Paths"];
return o as Paths;
}
}
答案 1 :(得分:1)
您的配置现在应该如下所示:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="Disk" type="ConsoleApplication1.DiskConfigSection, ConsoleApplication1"/>
</configSections>
<Disk>
<Paths>
<Path name="one" permission="1" />
<Path name="two" permission="2" />
<Path name="three" permission="3" />
</Paths>
</Disk>
</configuration>
您的课程现在应如下所示:
using System.Configuration;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
var t = DiskConfigSection.GetConfig();
// Put a breakpoint on the line after this and put a watch on t
}
}
public class Path : ConfigurationElement
{
[ConfigurationProperty("name", IsRequired = true)]
public string Name
{
get
{
return (string)this["name"];
}
}
[ConfigurationProperty("permission", IsRequired = true)]
public string Permission
{
get
{
return (string)this["permission"];
}
}
}
public class Paths : ConfigurationElementCollection
{
public Path this[int index]
{
get
{
return BaseGet(index) as Path;
}
set
{
if (BaseGet(index) != null)
{
BaseRemoveAt(index);
}
BaseAdd(index, value);
}
}
protected override ConfigurationElement CreateNewElement()
{
return new Path();
}
protected override object GetElementKey(ConfigurationElement element)
{
return ((Path)element).Name;
}
}
public class DiskConfigSection : ConfigurationSection
{
public static DiskConfigSection GetConfig()
{
var b = ConfigurationManager.GetSection("Disk") != null;
return b ? (DiskConfigSection)ConfigurationManager.GetSection("Disk") : new DiskConfigSection();
}
[ConfigurationProperty("Paths")]
[ConfigurationCollection(typeof(Paths), AddItemName = "Path")]
public Paths Paths
{
get
{
var o = this["Paths"];
return o as Paths;
}
}
}
}
我已在控制台应用中测试过并且配置已完全加载。