C# - 如何确定映射的 EXE 配置文件中是否存在配置节?
C# - How to Determine if a Configuration Section exists in a mapped EXE configuration file?
我有一个 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
属性?
也许这是你的问题:
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>
我有一个 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
属性?
也许这是你的问题:
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>