在自定义配置中添加Intellisense

时间:2013-12-21 10:53:08

标签: .net configuration namespaces xsd intellisense

我查看了相关问题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类文件吗?

1 个答案:

答案 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知道如何阅读它。