Я написал пользовательскую конфигурацию для своего приложения, но у меня нет подходящего способа определить, нет ли какого-либо ConfigurationElement, отсутствующего в ConfigurationSection.Как определить «ConfigurationElement» доступно в настройках настраиваемой конфигурации «ConfigurationSection»
это мой пользовательский код конфигурации 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
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
DataExtractorConfig settigns = ConfigurationReader.GetSettings<DataExtractorConfig>();
Как определить, что параметр «параллельная обработка» присутствует или нет в файле конфигурации, например, в настоящее время он комментируется в файле конфигурации приложения, поэтому параметр parallelProcessingExists должен быть установлен с ложным.
Обычно вам не нужно определять его, присутствует элемент конфигурации или нет. Вы просто используете указанное по умолчанию значение. –
@SimonMourier проблема в том, что у меня есть еще один раздел в конфигурационном файле, который является общей конфигурацией, он также имеет узлы «executeLog», «eMail» и «parallelProcessing», если какой-либо другой параметр не имеет узла, который должен быть загружен из общий раздел. как в примере «parallelProcessing» отсутствует в разделе «DataExtractorSettings», поэтому он должен загружаться из общего раздела. –