2

アプリケーションのカスタム構成を記述しましたが、ConfigurationSectionに存在しないConfigurationElementがあるかどうかを判断する適切な方法はありません。「ConfigurationElement」の決定方法は、「ConfigurationSection」のカスタム構成設定で利用可能です

これはこれは、ここで

public static class ConfigurationReader 
{ 

private const string _customSeetingParentNode = "ApplicationsSettings"; 

public static T GetSettings<T>(string configFileName = "AppSettings.xml", string sectionGroupName = "ApplicationsSettings") 
{ 
    System.Configuration.Configuration config; 
    ConfigurationSection customConfig; 
    ExeConfigurationFileMap fileMap; 
    T result; 
    string settingKey; 

    try 
    { 
     fileMap = new ExeConfigurationFileMap(); 
     fileMap.ExeConfigFilename = string.Format("{0}\\{1}", AppDomain.CurrentDomain.BaseDirectory, configFileName); 

     config = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None); 
     var caSetting = typeof(T).GetCustomAttributes(typeof(SettingProperty), false); 

     string sectionName; 
     dynamic dynSettingClass = null; 
     if (caSetting != null && caSetting.Length > 0) 
     { 
      settingKey = (caSetting[0] as SettingProperty).Name; 
      sectionName = string.Concat(_customSeetingParentNode, "/", settingKey); 
      customConfig = (ConfigurationSection)config.GetSection(sectionName); 

      if (customConfig != null && customConfig.ElementInformation.IsPresent) 
      { 
       //Here how do I determine the <parallelProcessing> setting is present or not in configuration file, 
       //like currently it is commented in app config file so the parallelProcessingExists should set with false 

       //bool parallelProcessingExists = ? 

       dynSettingClass = customConfig; 
      } 
      else 
      { 
       dynSettingClass = Activator.CreateInstance(typeof(T)); 
      } 

     } 
     else 
     { 
      dynSettingClass = Activator.CreateInstance(typeof(T)); 
     } 

     result = (T)Convert.ChangeType(dynSettingClass, typeof(T)); 
     return result; 
    } 
    finally 
    { 
     config = null; 
     customConfig = null; 
     fileMap = null; 
    } 

} 
} 

ファイルApp.configファイルから設定を読み込むためのコードである私のカスタム構成app.configをコード

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <configSections> 
    <sectionGroup name="ApplicationsSettings" type="App.Configuration.ConfigurationGroup, App.Configuration.Core"> 
     <section name="DataExtractorSettings" type="App.Configuration.DataExtractorConfig, App.Configuration.Core" /> 
    </sectionGroup> 
    </configSections> 

    <ApplicationsSettings> 
    <DataExtractorSettings> 
     <executionLog> 
     <enabled value="Y" /> 
     <copyOnReportDirectory value="Y" /> 
     <logFilePath value="D:\MyBatchProcessLog\MasterDataExtractor" /> 
     </executionLog> 
     <eMail> 
     <fromEmailID value="[email protected]" /> 
     <webURL value="http://PROD/login.aspx" /> 
     </eMail> 

    <!--<parallelProcessing> 
     <allowed value="Y" /> 
     <threds value="6" /> 
     </parallelProcessing>--> 

    </DataExtractorSettings> 

    </ApplicationsSettings> 

</configuration> 

クラスDataExtractorConfig

namespace App.Configuration 
{ 
    [SettingProperty(Name: "dataExtractorSettings")] 
    public class DataExtractorConfig : ConfigurationSection 
    { 
     [ConfigurationProperty("executionLog")] 
     public LogConfig ExecutionLog 
     { 
      get 
      { 
       if (base["executionLog"] != null) 
       { 
        return (LogConfig)base["executionLog"]; 
       } 
       else 
       { 
        return null; 
       } 

      } 
     } 

     [ConfigurationProperty("parallelProcessing")] 
     public ParallelProcessConfig ParallelProcessing 
     { 
      get 
      { 
       if (base["parallelProcessing"] != null) 
       { 
        return (ParallelProcessConfig)base["parallelProcessing"]; 
       } 
       else 
       { 
        return null; 
       } 
      } 
     } 

     [ConfigurationProperty("eMail")] 
     public EmailConfig Email 
     { 
      get 
      { 
       if (base["eMail"] != null) 
       { 
        return (EmailConfig)base["eMail"]; 
       } 
       else 
       { 
        return null; 
       } 
      } 
     } 
    } 
} 

ですapp.configファイルから設定を読み込むコードです

DataExtractorConfig settigns = ConfigurationReader.GetSettings<DataExtractorConfig>(); 

"parallelProcessing"設定が存在するかどうかは、現在はappconfigファイルにコメントされているので、parallelProcessingExistsをfalseに設定する必要があります。

+0

通常、設定要素が存在するかどうかを判断する必要はありません。あなたが宣言したデフォルト値を使用するだけです。 –

+0

@SimonMourier問題は、他の設定のいずれかがロードされるべきノードを持たない場合、設定ファイルに "executionLog"、 "eMail"& "parallelProcessing"ノードを持つ共通設定であるセクションがもう1つあることです。共通セクション。例のように "parallelExcessor"は "DataExtractorSettings"セクションに存在しないので、共通セクションからロードする必要があります。 –

答えて

2

DataExtractorConfigクラスを作成しましたので、それを使用してください。 GetSectionメソッドから返されるオブジェクトはDataExtractorConfigにキャストできます。今すぐ簡単にParallelProcessingEmailExecutionLogのプロパティにアクセスし、対応する設定セクションが存在するかどうかを確認します。例:

var customConfig = (DataExtractorConfig)config.GetSection(sectionName); 

if (customConfig != null && customConfig.ElementInformation.IsPresent) 
{ 
    if(customConfig.ParallelProcessing.ElementInformation.IsPresent) 
    { 
     // TODO 
    } 
    else 
    { 
     // TODO 
    } 

    dynSettingClass = customConfig; 
} 
+0

ありがとう@Michalそれは:) –

関連する問題