2010-12-16 4 views
1

Я создал файл конфигурации в своем проекте и назвал его MyConfig.config. Он содержит следующее:ConfigurationManager для получения данных конфигурации проекта

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

I''m пытается получить доступ к этому следующим образом:

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

Очевидно, что я делаю что-то неправильно. Возможно ли использовать ConfigurationManager таким образом?

ответ

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> 

Done.

0

Выполняется ли конфигурация файла конфигурации в выходной каталог и переименовывается в файл YourExeFile.exe.config? Насколько я знаю, вы должны назвать свой конфигурационный файл app.config или скопировать его самостоятельно после сборки.

Если вы хотите загрузить конфигурационную форму в альтернативный файл конфигурации, вы можете использовать метод ConfigurationMangager.OpenMappedConfigurationFile() для загрузки этого файла вместо файла конфигурации по умолчанию. См. Пример MSDN.

Если вы хотите использовать настраиваемый пользовательский раздел конфигурации, вам необходимо предоставить классы для доступа к этому разделу. Взгляните на this good article, чтобы начать.

0

Я не думаю, что вы можете использовать конфигурационный файл таким образом. Вы считали, что используете файл .settings?

Смежные вопросы