1

プロジェクト内に構成ファイルを作成し、それをMyConfig.configと呼びました。次のものが含まれています。

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

私は次のようにこれにアクセスしようとしています:

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

明らかに私は何か間違ったことをしている。このようにConfigurationManagerを使用することも可能ですか?

4

3 に答える 3

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>

終わり。

于 2010-12-16T16:14:17.000 に答える
0

構成ファイルは出力ディレクトリにコピーされ、YourExeFile.exe.configに名前が変更されますか?私の知る限り、設定ファイルにapp.configという名前を付けるか、ビルド後に自分でコピーする必要があります。

代替構成ファイルから構成ConfigurationMangager.OpenMappedConfigurationFile()をロードする場合は、デフォルトの構成ファイルの代わりに、この方法を使用してそのファイルをロードできます。例については、 MSDNを参照してください。

カスタムユーザー定義の構成セクションを使用する場合は、そのセクションにアクセスするためのクラスを提供する必要があります。始めるためにこの良い記事を見てください。

于 2010-12-16T09:19:52.263 に答える
0

このように設定ファイルを使用することはできないと思います。.settingsファイルの使用を検討しましたか?

于 2010-12-16T13:58:00.190 に答える