考虑:
该行:
<section name="unity" />
块:
<unity>
<typeAliases />
<containers />
</unity>
在缺少块时,假设该行在 .config 文件中可用。
如何以编程方式检查块是否存在?
[编辑]
对于那些天才的人,他们很快就将问题标记为否定:
我已经尝试了ConfigurationManager.GetSection()
和
var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
var section = config.GetSection("unity");
var sInfo = section.SectionInformation;
var isDeclared = sInfo.IsDeclared;
如果我弄错了,请纠正我,如果定义了<configSections>
,上面不会返回 null (即使实际的统一块是丢失)。
答案 0 :(得分:14)
我在搜索这篇文章的答案时发现了这篇文章。我想我会回来并发布答案,因为我已经解决了它。
由于ConfigurationSection继承自ConfigurationElement,因此您可以使用ElementInformation来判断在反序列化后是否找到了实际元素。
使用此方法检测配置文件中是否缺少ConfigurationSection元素。 ConfigurationSection中的以下方法来自它对ConfigurationElement的继承:
//After Deserialization
if(!customSection.ElementInformation.IsPresent)
Console.WriteLine("Section Missing");
要确定某个元素是否缺失,您可以使用该部分中的属性(让我们假装它被称为&#39; PropName&#39;),获取PropName的ElementInformation属性并检查IsPresent标志:
if(!customSection.propName.ElementInformation.IsPresent)
Console.WriteLine("Configuration Element was not found.");
当然,如果你想检查&lt; configSections&gt;如果缺少定义,请使用以下方法:
CustomSection mySection =
config.GetSection("MySection") as CustomSection;
if(mySection == null)
Console.WriteLine("ConfigSection 'MySection' was not defined.");
- 希望这有帮助
答案 1 :(得分:2)
使用ConfigurationManager.GetSection。如果该部分不存在,这将返回null
。
返回值
类型:System.Object
指定的ConfigurationSection对象,如果该部分不存在,则返回null。
if (ConfigurationManager.GetSection("unity") == null)
{
Console.WriteLine("Section does not exist");
}
答案 2 :(得分:2)
以下是我解决这个问题的方法。
<?xml version="1.0" encoding="utf-8" ?>
<d:PercentComplete m:type="Edm.Int32">30</d:PercentComplete>
第一次检查是定义,第二次是块
答案 3 :(得分:0)
与其他人类似,我认为您需要使用ConfigurationManager.GetSection()。但是,如果我正确地阅读了您的问题,您是否要求检查部分名称中是否存在统一性=&#34; Unity&#34;?如果是这样,您将需要执行以下操作:
ConfigurationManager.GetSection("unity/unity");
然后,您可以根据需要检查cs或执行类似于RB建议的操作。
<强> *** *** EDIT 强>
好的,这个怎么样,它有点长啰嗦但可能会有效:
ConfigurationSection section = ConfigurationManager.GetSection("unity");
System.Xml.XmlDocument xmlData = new System.Xml.XmlDocument();
xmlData.LoadXml(section);
XmlNode Found = null;
foreach (System.Xml.XmlNode node in xmlData.ChildNodes)
{
if (node.HasChildNodes)
{
Found = FindNode(node.ChildNodes, "unity");
}
}
if(Found == null) //do something
答案 4 :(得分:0)
您可以使用xml
阅读器打开配置文件,然后导航到名为&#34; unity&#34;或者您可以实现IConfigurationSectionHandler
,在CreateMethod
内,您可以区分传入节点,并检查它是否为行或块
public class CustomConfigurationSectionHandler : IConfigurationSectionHandler {
public object Create(object parent,
object configContext, System.Xml.XmlNode section)
{
//check if section is a line , if yes return null
if( section ...)
{ return null; }
//otherwise return whatever result you want :)
else { }
}
}
当然,处理程序需要在配置文件中注册,以便在您调用ConfigurationManager.GetSection("unity")
时它将被解析。
答案 5 :(得分:0)
我试图避免基于XML的解决方案。但似乎是实现这一目标的唯一途径。
列出以下解决方案以供将来参考。
[@ sr28和@tchrikch提出了同样的建议]
if (XDocument
.Load(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile)
.XPathSelectElement("/*[local-name() = 'configuration']/*[local-name() = 'unity']") == null)
答案 6 :(得分:-1)
我相信你可以使用ConfigurationManager.GetSection Method。
if(ConfigurationManager.GetSection(sectionName) == null)
{
// do something
}
答案 7 :(得分:-1)
您可以打开配置文件并尝试按名称访问配置。
CustomSection customSection;
// Get the current configuration file.
System.Configuration.Configuration config =
ConfigurationManager.OpenExeConfiguration(
ConfigurationUserLevel.None);
// Create the section entry
// in the <configSections> and the
// related target section in <configuration>.
if (config.Sections["CustomSection"] == null)
{