我查看了相关问题Intellisense for custom config section problem with namespaces,该问题描述了我遇到的同样问题。虽然解决方案不适合我。
我在这里粘贴了我的整个解决方案,因此其他人也可以看到如何实现所需的功能。我已经关注定制配置部分的许多教程以及如何在配置文件中实现Intellisense,但没有一个能解决我遇到的问题。
我收到一个ConfigurationErrorException:
Unrecognized attribute 'xmlns'. Note that attribute names are case-sensitive.
我不太热衷于解决它。
我的自定义配置部分类:
namespace CustomConfigurationExample
{
using System.Configuration;
public class MyConfiguration : ConfigurationSection
{
[ConfigurationProperty("MyInstance")]
public MyConfigurationElementCollection Configuration
{
get { return (MyConfigurationElementCollection)this["MyInstance"]; }
}
}
public class MyConfigurationElement : ConfigurationElement
{
[ConfigurationProperty("MyEnums", IsKey = true, IsRequired = true)]
public MyEnums MyEnums
{
get { return (MyEnums)base["MyEnums"]; }
}
[ConfigurationProperty("ConnectionAddress", IsKey = true, IsRequired = true)]
public string ConnectionAddress
{
get { return (string)this["ConnectionAddress"]; }
}
[ConfigurationProperty("LoadBalancer", IsKey = true, IsRequired = true)]
public bool LoadBalancer
{
get { return (bool)this["LoadBalancer"]; }
}
}
public class MyConfigurationElementCollection : ConfigurationElementCollection
{
protected override ConfigurationElement CreateNewElement()
{
return new MyConfigurationElement();
}
protected override object GetElementKey(ConfigurationElement element)
{
return ((MyConfigurationElement)element).MyEnums;
}
}
}
我的枚举:
namespace CustomConfigurationExample
{
public enum MyEnums
{
AB,
CD,
EF
}
}
我的App.config:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="MyConfiguration" type="CustomConfigurationExample.MyConfiguration, CustomConfigurationExample" requirePermission="false" />
</configSections>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
<MyConfiguration xmlns="http://tempuri.org/MyConfiguration.xsd">
<MyInstance>
<add MyEnums="AB" LoadBalancer="true" ConnectionAddress="http://win.tendo.server:10305" />
</MyInstance>
</MyConfiguration>
</configuration>
我的架构文件:
<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="MyConfiguration"
targetNamespace="http://tempuri.org/MyConfiguration.xsd"
elementFormDefault="qualified"
xmlns="http://tempuri.org/MyConfiguration.xsd"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="add">
<xs:annotation>
<xs:documentation>My configuration.</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:attribute name="MyEnums" use="required" >
<xs:annotation>
<xs:documentation>MyEnums at blah blah</xs:documentation>
</xs:annotation>
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="AB">
<xs:annotation>
<xs:documentation>AB</xs:documentation>
</xs:annotation>
</xs:enumeration>
<xs:enumeration value="CD">
<xs:annotation>
<xs:documentation>CD</xs:documentation>
</xs:annotation>
</xs:enumeration>
<xs:enumeration value="EF">
<xs:annotation>
<xs:documentation>EF</xs:documentation>
</xs:annotation>
</xs:enumeration>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:attribute name="ConnectionAddress"></xs:attribute>
<xs:attribute name="LoadBalancer">
<xs:annotation>
<xs:documentation>Loadbanlancer.</xs:documentation>
</xs:annotation>
<xs:simpleType>
<xs:restriction base="xs:boolean">
</xs:restriction>
</xs:simpleType>
</xs:attribute>
</xs:complexType>
</xs:element>
</xs:schema>
......最后我的program.cs:
namespace CustomConfigurationExample
{
using System.Collections;
using System.Configuration;
using System.Linq;
class Program
{
static void Main(string[] args)
{
var mySettings = new ArrayList(((MyConfiguration)ConfigurationManager.GetSection("MyConfiguration")).Configuration).Cast<MyConfigurationElement>().Select(x => new { x.MyEnums, x.LoadBalancer, x.ConnectionAddress, }).SingleOrDefault();
}
}
}
现在我的配置中的intellisense工作正常。但是当我运行程序时尝试映射我的设置时出现异常。
我可以删除我的'xmlns =“http://tempuri.org/MyConfiguration.xsd”'部分
我的App.config文件中的“<MyConfiguration xmlns="http://tempuri.org/MyConfiguration.xsd">
”并在“架构”中的App.config属性下的物理位置添加位置,智能感知也在工作和映射。但是物理位置与我的机器相关联,我希望该位置是相对的,因为模式文件是我的VS解决方案的一部分。我更喜欢在我的解决方案中引用相对文件。
我缺少什么?我怀疑我需要用命名空间和schemalocation来装饰MyConfiguration
类文件吗?
答案 0 :(得分:2)
我在你的代码中发现了问题,结果很简单。您需要将xmlns标记添加到MyConfiguration类,如下所示:
public class MyConfiguration : ConfigurationSection
{
[ConfigurationProperty("xmlns")]
public string XmlNamespace
{
get
{
return (string)this["xmlns"];
}
set
{
this["xmlns"] = value;
}
}
[ConfigurationProperty("MyInstance")]
public MyConfigurationElementCollection Configuration
{
get { return (MyConfigurationElementCollection)this["MyInstance"]; }
}
}
然后ConfigurationManager知道如何阅读它。