Как определить, существует ли раздел конфигурации в сопоставленном файле конфигурации EXE? - PullRequest
2 голосов
/ 13 июня 2019

У меня есть проект C #, который читает из автономного файла конфигурации с именем test.config. Это отдельный файл из типичного App.config.

Я пытаюсь определить, содержит ли файл test.config необязательное свойство TestProperty из кода. Я пытался использовать TestProperty.ElementInformation.IsPresent, но это всегда приводит к значению FLASE, даже когда элемент section действительно существует.

class Program
{
    static void Main(string[] args)
    {
        string filePath = @"C:\Users\username\Desktop\TestProject\ConfigTestApp\Test.Config";
        ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap(filePath);
        fileMap.ExeConfigFilename = Path.GetFileName(filePath);

        Configuration config = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);
        TestConfigSection section = config.GetSection("TestConfigSection") as TestConfigSection;
        bool isPresent = section.TestProperty.ElementInformation.IsPresent; // Why is this always false?
    }
}

Файл test.config выглядит следующим образом:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name ="TestConfigSection" type ="ConfigTestApp.TestConfigSection, ConfigTestApp"/>
  </configSections>

  <TestConfigSection>
    <TestProperty testvalue="testing 123" />
  </TestConfigSection>
</configuration>

Классы поддержки:

public class TestConfigSection : ConfigurationSection
{
    [ConfigurationProperty("TestProperty", IsRequired = true)]
    public TestConfigElement TestProperty
    {
        get
        {
            return base["TestProperty"] as TestConfigElement;
        }
    }
}

public class TestConfigElement : ConfigurationElement
{
    [ConfigurationProperty("testvalue", IsKey = true, IsRequired = true)]
    public string TestValue
    {
        get { return base["testvalue"] as string; }
        set { base["testvalue"] = value; }
    }
}

Если я переместлю раздел в App.config и использую ConfigurationManager.GetSection("TestConfigSection"), IsPresent, кажется, будет работать нормально, но мне нужно, чтобы это работало из отдельного файла (test.config).

Есть ли способ заставить TestProperty.ElementInformation работать или каким-либо другим способом определить, содержит ли файл test.config свойство TestProperty?

1 Ответ

1 голос
/ 13 июня 2019

Возможно, это ваша проблема:

ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap(filePath);
fileMap.ExeConfigFilename = Path.GetFileName(filePath);

Не должен ли ExeConfigFilename быть полный путь к файлу, как этот?

fileMap.ExeConfigFilename = filePath;

Если это не проблема, мне недавно пришлось сделать что-то вроде того, что вы делаете, и вот что я сделал (используя данные вашего примера).

string filePath = @"C:\Users\username\Desktop\TestProject\ConfigTestApp\Test.Config";
ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap { ExeConfigFilename = filePath };
config = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);
AppSettingsSection section = (AppSettingsSection) config.GetSection("TestConfigSection");

if ( section != null )
{
  string testValue = section .Settings["TestProperty"].Value;
}

В моем конфигурационном файле я использовал этот тип формата:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <TestConfigSection file="">
    <clear />
    <add key="TestProperty" value="testing 123" />
  </TestConfigSection>
</configuration>
...