ConfigurationManager获取项目配置数据

时间:2010-12-16 09:09:29

标签: c# configuration configurationmanager

我在项目中创建了一个配置文件,并将其命名为MyConfig.config。它包含以下内容:

<configuration>
  <MySection MyString="StringHere"/>
</configuration>

我正在尝试按如下方式访问:

AppSettingsSection settings = (AppSettingsSection)ConfigurationManager.GetSection("MySection");
string myString = settings.Settings["MyString"].Value;

显然我做错了什么。甚至可以这样使用ConfigurationManager吗?

3 个答案:

答案 0 :(得分:3)

是的,有可能。有几个步骤。首先,您必须在配置中定义您的部分。这涉及声明部分名称和类型(您编写的类):

<configSections>
   <sectionGroup name="system.web">
      <section name="myConfig" type="MyConfig.MyConfigSectionHandler,MyConfig" />
   </sectionGroup>
</configSections>

接下来,您必须实际编写代码来处理该部分。它必须继承自IConfigurationSectionHandler:

using System;
using System.Web;
using System.Xml;
using System.Configuration;

namespace MyConfig
{
   public enum LevelSetting
   {
      High,
      Medium,
      Low,
      None
   }
   public class MyConfigSectionHandler : IConfigurationSectionHandler
   {
      public virtual object Create(object parent,object configContext,XmlNode section)
      {
         int iLevel = 0;
         string sName = "";

         ConfigHelper.GetEnumValue(section, "level", typeof(LevelSetting), ref iLevel);
         ConfigHelper.GetStringValue(section,"name",ref sName);
         return new MyConfigSection((LevelSetting)iLevel,sName);
      }
   }
   public class MyConfigSection
   {
      private LevelSetting level = LevelSetting.None;
      private string name = null;

      public MyConfigSection(LevelSetting _level,string _name)
      {
         level = _level;
         name = _name;
      }
      public LevelSetting Level
      {
         get {return level;}
      }
      public string Name
      {
         get {return name;}
      }
   }
   internal class ConfigHelper
   {
      public static XmlNode GetEnumValue
      (XmlNode _node, string _attribute,Type _enumType, ref int _val)
      {
         XmlNode a = _node.Attributes.RemoveNamedItem(_attribute);
         if(a==null)
            throw new ConfigurationException("Attribute required: " + _attribute);
         if(Enum.IsDefined(_enumType, a.Value))
            _val = (int)Enum.Parse(_enumType,a.Value);
         else
            throw new ConfigurationException("Invalid Level",a);
         return a;
      }
      public static XmlNode GetStringValue(XmlNode _node, string _attribute, ref string _val)
      {
         XmlNode a = _node.Attributes.RemoveNamedItem(_attribute);
         if(a==null)
            throw new ConfigurationException("Attribute required: " + _attribute);
         else
            _val = a.Value;
         return a;      
      }
   }
}

接下来,将实际配置项添加到web.config中:

<system.web>
    <myConfig level="High" name="hello world" />
</system.web>

完成。

答案 1 :(得分:0)

您是否将配置文件复制到输出目录并重命名为YourExeFile.exe.config?据我所知,您必须将配置文件命名为app.config,或在构建后自行复制。

如果要加载配置表单备用配置文件,可以使用ConfigurationMangager.OpenMappedConfigurationFile()方法加载该文件而不是默认配置文件。有关示例,请参阅MSDN

如果要使用自定义用户定义的配置部分,则必须提供访问该部分的类。看看this good article即可开始使用。

答案 2 :(得分:0)

我认为你不能以这种方式使用配置文件。您是否考虑过使用.settings文件?