【问题标题】:Customized IEnumerable in ConfigurationSection IIConfigurationSection II 中的自定义 IEnumerable
【发布时间】:2013-01-22 17:51:52
【问题描述】:

原始问题和代码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:

【问题讨论】:

标签: c# configuration app-config


【解决方案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;
        }
    }

【讨论】:

  • @Monkieboy:谢谢。但我不确定你为什么重复我的回答。您认为这样做有什么价值?
  • 我无法发表评论,@Ferpega 没有将您的答案标记为完整,我假设他还没有找到解决方案。我正在使用您的建议作为提供解决方案的平台,如果您认为我没有为这个问题增加清晰度或价值,我很乐意删除我的答案。
  • @Monkieboy:如果你认为你的答案增加了价值,那就别说了,没问题。我认为如果它仍然不起作用,Ferpega 会要求澄清。你必须给他一些时间来测试它 - 或者甚至意识到有一个答案;)
  • 好的,请原谅我不想惹恼你或其他任何人。我将删除我的贡献。
  • @Monkieboy:你当然没有惹恼任何人,我也没有要求你删除你的答案。保持冷静:-)
【解决方案2】:

您的配置现在应该如下所示:

<?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;
        }
    }
}
}

我已经在控制台应用程序中进行了测试,并且配置已完全加载。

【讨论】:

  • 感谢@DanielHilgarth,这是因为他的 cmets 我能够构建这个。
猜你喜欢
  • 2013-01-22
  • 1970-01-01
  • 2010-12-18
  • 1970-01-01
  • 2013-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多