C# 在ConfigurationSection中自定义IEnumerable

C# 在ConfigurationSection中自定义IEnumerable,c#,configuration,app-config,C#,Configuration,App Config,我需要创建一个简单的自定义配置节,其中包含一个IEnumerable 我读过几篇文章和stackoverflow链接,举个简单的例子: 因此,我在控制台应用程序中有一个配置文件部分: <?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <section name="Disk" type="ConsoleApplicatio

我需要创建一个简单的自定义配置节,其中包含一个IEnumerable

我读过几篇文章和stackoverflow链接,举个简单的例子:

因此,我在控制台应用程序中有一个配置文件部分:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="Disk"
             type="ConsoleApplication1_ConfigurationEnumerable.PathsConfigSection"/>
  </configSections>
  <Disk>
    <Paths>
      <Path name="one" permission="1" />
      <Path name="two" permission="2" />
      <Path name="three" permission="3" />
    </Paths>
  </Disk>
</configuration>
在这里,program.cs使用了整个程序: 使用制度

namespace ConsoleApplication1_ConfigurationEnumerable
{
    class Program
    {
        static void Main(string[] args)
        {
            var config = PathsConfigSection.GetConfig();
            if (config == null || config.Paths.Count == 0)
            {
                Console.WriteLine("Is null or empty");
            }
            else
            {
                foreach (Path item in config.Paths)
                {
                    Console.WriteLine("Item {0} with valuer {1}", item.Name, item.Permission);
                }
            }
        }
    }
}
这里的问题在这两行中:

//return (PathsConfigSection)System.Configuration
//       .ConfigurationManager.GetSection("Disk") ?? new PathsConfigSection();
return (PathsConfigSection)System.Configuration
       .ConfigurationManager.GetSection("Paths") ?? new PathsConfigSection();
如果我使用第二个(上面没有注释),它将返回null

如果使用已注释的,则会引发如下异常:

System.Configuration.ConfigurationErrorsException未处理
HResult=-2146232062消息=创建 磁盘的配置节处理程序:无法加载类型 来自的“ConsoleApplication1\u ConfigurationEnumerable.PathsConfigSection” 程序集'System.Configuration,版本=4.0.0.0,区域性=neutral, PublicKeyToken=b03f5f7f11d50a3a'。 (C:\Users\blackberry\Desktop\ConsoleApplication1\u ConfigurationEnumerable\ConsoleApplication1\u ConfigurationEnumerable\bin\Debug\ConsoleApplication1\u ConfigurationEnumerable.vshost.exe.config 第4行)Source=System.Configuration=Message=发生错误 为磁盘创建配置节处理程序:无法加载 键入“ConsoleApplication1\u ConfigurationEnumerable.PathsConfigSection” 从程序集'System.Configuration,Version=4.0.0.0,Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'.
Filename=C:\Users\blackberry\Desktop\ConsoleApplication1\u ConfigurationEnumerable\ConsoleApplication1\u ConfigurationEnumerable\bin\Debug\ConsoleApplication1\u ConfigurationEnumerable.vshost.exe.config 行=4堆栈跟踪: 在System.Configuration.BaseConfigurationRecord.FindAndensureRefactoryRecord(字符串 configKey、Boolean和isRootDeclaredHere) 位于System.Configuration.BaseConfigurationRecord.GetSectionRecursive(字符串 configKey,Boolean getLkg,Boolean checkPermission,Boolean getRuntimeObject,布尔请求服务器,对象和结果,对象& resultRuntimeObject) 在System.Configuration.BaseConfigurationRecord.GetSection(字符串 配置密钥) 位于System.Configuration.ClientConfigurationSystem.System.Configuration.Internal.IInternalConfigSystem.GetSection(字符串 部门名称) 位于System.Configuration.ConfigurationManager.GetSection(字符串sectionName) 在控制台应用程序1_ConfigurationEnumerable.PathsConfigSection.GetConfig()上 在里面 C:\Users\blackberry\Desktop\ConsoleApplication1\u ConfigurationEnumerable\ConsoleApplication1\u ConfigurationEnumerable\Disk.cs:line 63 在控制台Application 1_ConfigurationEnumerable.Program.Main(字符串[]) args)在 C:\Users\blackberry\Desktop\ConsoleApplication1\u ConfigurationEnumerable\ConsoleApplication1\u ConfigurationEnumerable\Program.cs:line 9 位于System.AppDomain.\u nExecuteAssembly(RuntimeAssembly程序集,字符串[]args) 位于System.AppDomain.ExecuteAssembly(字符串汇编文件、证据汇编安全性、字符串[]args) 在Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()上 位于System.Threading.ThreadHelper.ThreadStart\u上下文(对象状态) 位于System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext、ContextCallback回调、对象状态、布尔值 (同步CTX) 在System.Threading.ExecutionContext.Run(ExecutionContext ExecutionContext,ContextCallback回调,对象状态,布尔值 (同步CTX) 在System.Threading.ExecutionContext.Run(ExecutionContext ExecutionContext,ContextCallback回调,对象状态) 位于System.Threading.ThreadHelper.ThreadStart()的InnerException:System.TypeLoadException HResult=-2146233054 消息=无法从加载类型“ConsoleApplication1\u ConfigurationEnumerable.PathsConfigSection” 程序集'System.Configuration,版本=4.0.0.0,区域性=neutral, PublicKeyToken=b03f5f7f11d50a3a'。 Source=System.Configuration TypeName=ConsoleApplication1\u ConfigurationEnumerable.PathsConfigSection 堆栈跟踪: 位于System.Configuration.TypeUtil.GetTypeWithReflectionPermission(IInternalConfigHost 主机,字符串类型字符串,布尔值(错误) 在System.Configuration.RuntimeConfigurationRecord.RuntimeConfigurationFactory.Init(RuntimeConfigurationRecord 配置记录,工厂记录(工厂记录) 位于System.Configuration.RuntimeConfigurationRecord.RuntimeConfigurationFactory.InitWithRestrictedPermissions(RuntimeConfigurationRecord 配置记录,工厂记录(工厂记录) 在System.Configuration.RuntimeConfigurationRecord.CreateSectionFactory(FactoryRecord)中 工厂记录) 在System.Configuration.BaseConfigurationRecord.FindAndensureRefactoryRecord(字符串 configKey、Boolean和isRootDeclaredHere) 内部异常:

我的错在哪里?

configSections
标记中指定类时,需要使用:

<configSections>
  <section name="Disk"
           type="ConsoleApplication1_ConfigurationEnumerable.PathsConfigSection, ConsoleApplication1"/>
</configSections>
顺便说一句:你的名字空间很奇怪。命名标准建议您在分离命名空间层次结构时使用点(
):

namespace ConsoleApplication1.ConfigurationEnumerable
configSections
标记中指定类时,需要使用:

<configSections>
  <section name="Disk"
           type="ConsoleApplication1_ConfigurationEnumerable.PathsConfigSection, ConsoleApplication1"/>
</configSections>
顺便说一句:你的名字空间很奇怪。命名标准建议您在分离命名空间层次结构时使用点(
):

namespace ConsoleApplication1.ConfigurationEnumerable

我认为你应该使用第一行(注释掉的那一行)。问题出在配置文件中的
元素中。按照Daniel的回答看应该是什么样子。

我认为你应该使用第一行(注释掉的那一行)。问题出在配置文件中的
元素中。按照Daniel的回答看应该是什么样子。

不,不是。仔细比较。请注意末尾的逗号和
控制台应用程序1
。实际情况并非如此。请还原原始问题并针对新问题发布新问题。因为这是另一个问题。欢迎你来ref