6

アプリケーションの現在の構成ファイルを使用している場合、System.Configuration.NameValueSectionHandler で定義されたセクションを使用する構成ファイルから値を取得するのは簡単です。

構成ファイルの例。

<configuration>
  <configSections>
    <section name="MyParams" type="System.Configuration.NameValueSectionHandler" />
  </configSections>

  <MyParams>
    <add key="FirstParam" value="One"/>
    <add key="SecondParam" value="Two"/>
  </MyParams>
</configuration>

簡単に読めるサンプルコード。

NameValueCollection myParamsCollection =
   ConfigurationManager.GetSection("MyParams") as NameValueCollection;

これは動作しないコードです。

NameValueCollection collection =
  ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None)
  .GetSection("MyParams") as NameValueCollection;

コンパイル時に次のエラーで失敗します。

参照変換、ボックス化変換、ボックス化解除変換、ラッピング変換、または null 型変換を介して、型 'System.Configuration.ConfigurationSection' を 'System.Collections.Specialized.NameValueCollection' に変換できません。

ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None) は System.Configuration.Configuration を返し、Configuration.GetSection は ConfigurationSection を返します。

ConfigurationManager.GetSection はオブジェクトを返します。

では、OpenExeConfiguration を使用する必要がある場合、NameValueCollection を取得するにはどうすればよいでしょうか?

4

1 に答える 1

12

私は2年前から自分の答えに出くわしました。

NameValueSectionHandler - アプリケーション構成ファイルに書き戻すためにこのセクション タイプを使用できますか?

これが私の現在の問題を解決するための私のアプローチです。

ExeConfigurationFileMap configFileMap = new ExeConfigurationFileMap() { 
   ExeConfigFilename = "path to config here" 
    };

Configuration config = ConfigurationManager.OpenMappedExeConfiguration(
   configFileMap, ConfigurationUserLevel.None);

ConfigurationSection myParamsSection = config.GetSection("MyParams");

string myParamsSectionRawXml = myParamsSection .SectionInformation.GetRawXml();
XmlDocument sectionXmlDoc = new XmlDocument();
sectionXmlDoc.Load(new StringReader(myParamsSectionRawXml ));
NameValueSectionHandler handler = new NameValueSectionHandler();

NameValueCollection handlerCreatedCollection = 
   handler.Create(null, null, sectionXmlDoc.DocumentElement) as NameValueCollection;

Console.WriteLine(handlerCreatedCollection.Count);

従来の IConfigurationSectionHandler 型 NameValueSectionHandler、DictionarySectionHandler、SingleTagSectionHandler のいずれかで動作するメソッド。

public static object GetConfigurationValues(string configFileName, string sectionName)
{
    ExeConfigurationFileMap configFileMap = new ExeConfigurationFileMap() { ExeConfigFilename = configFileName };
    Configuration config = ConfigurationManager.OpenMappedExeConfiguration(configFileMap, ConfigurationUserLevel.None);
    ConfigurationSection section = config.GetSection(sectionName);
    string xml = section.SectionInformation.GetRawXml();
    XmlDocument doc = new XmlDocument();
    doc.Load(XmlReader.Create(new StringReader(xml)));
    string type = section.SectionInformation.Type;
    string assemblyName = typeof(IConfigurationSectionHandler).Assembly.GetName().FullName;
    ObjectHandle configSectionHandlerHandle = Activator.CreateInstance(assemblyName, section.SectionInformation.Type);
    if (configSectionHandlerHandle != null)
    {
        IConfigurationSectionHandler handler = configSectionHandlerHandle.Unwrap() as IConfigurationSectionHandler;
        return handler.Create(null, null, doc.DocumentElement);
    }
    return null;
}
于 2012-12-11T17:25:09.597 に答える