过去3天我一直在网上搜索,但找不到任何关于这个问题的提法。我已经创建了一个自定义配置类,可以与我的app.config一起使用。一切正常。当不需要配置属性(配置元素)并且未在app.config中定义时,会出现此问题。似乎为配置属性返回默认值。有谁知道如何确定app.config中是否未定义该属性? (我一直试图发布我的app.config,但无法弄明白该怎么做......有谁知道怎么做?)
//Main
namespace TestStub
{
class Program
{
static void Main(string[] args)
{
CustomSettingsHandler config = (CustomSettingsHandler)ConfigurationManager.GetSection("CustomSettingsManager");
Console.WriteLine("Setting1 {0}", config.Setting1.CustomSettingItem);
Console.WriteLine("Setting2 {0}", config.Setting2.CustomSettingItem);
}
}
}
//Custom Configuration Class
namespace CustomConfiguration
{
public class CustomSettingsHandler : ConfigurationSection
{
[ConfigurationProperty("setting1", IsRequired = false)]
public CustomSettingElement Setting1 { get { return (CustomSettingElement)this["setting1"]; } }
[ConfigurationProperty("setting2", IsRequired = false)]
public CustomSettingElement Setting2 { get { return (CustomSettingElement)this["setting2"]; } }
}
public class CustomSettingElement : ConfigurationElement
{
[ConfigurationProperty("customsettingitem", IsRequired = false)]
public int CustomSettingItem { get { return (int)this["customsettingitem"]; } }
}
}
答案 0 :(得分:11)
我发现最好的方法是覆盖ConfigurationSection.PostDeserialize()
并检查从IsPresent
派生的每个部分成员的ConfigurationElement
属性。
public class CustomSettingsHandler : ConfigurationSection
{
// ...
protected override void PostDeserialize()
{
foreach (ConfigurationProperty property in Properties)
{
var configElement = this[property] as ConfigurationElement;
if (configElement != null
&& !configElement.ElementInformation.IsPresent)
{
this[property] = null;
}
}
base.PostDeserialize();
}
}
之后未从配置文件中读取的每个ConfigurationElement
将为null
。
答案 1 :(得分:4)
我能想到的两件事就是使用DefaultValue,就像这样:
[ConfigurationProperty("customsettingitem", DefaultValue = -1)]
public int CustomSettingItem { get { return (int)this["customsettingitem"]; } }
假设某些值无效。在这种情况下,CustomSettingItem == -1表示它未设置,> = 0是在config中设置的值。当然,假设-1首先没有有效的输入。
第二个想法是使用可以为空的int:
[ConfigurationProperty("customsettingitem", IsRequired = false)]
public int? CustomSettingItem { get { return (int?)this["customsettingitem"]; } }
现在如果在配置中没有设置任何内容,它应该默认为null而不是0。
答案 2 :(得分:2)
尝试以下方法:
configElement.ElementInformation.Properties[propName].ValueOrigin =
PropertyValueOrigin.SetHere
ValueOrigin
属性告诉您值的来源。
答案 3 :(得分:0)
到目前为止,如果未在配置文件中定义属性,我无法将该属性告知为null。似乎在它的无限智慧中,当你输入null时,微软决定你真的是指String.Empty或新的ConfigurationElement()。
我目前解决的方式是这样的:
bool _hasProp = true;
protected override object OnRequiredPropertyNotFound(string name)
{
if (name == "prop")
{
_hasProp = false;
return null; // note that this will still not make prop null
}
return base.OnRequiredPropertyNotFound(name);
}
[ConfigurationProperty("prop", IsRequired = true)]
public string Prop
{
get { return _hasProp ? (string) this["prop"] : null; }
}
这是一个黑客攻击,并会根据需要错误地标记该属性。如果您使用工具编辑配置文件,则不会喜欢这样。
答案 4 :(得分:0)
您还可以使用以下方法进行检查:
config.Setting1.CustomSettingItem.ElementInformation.IsPresent
如果在配置文件中找不到它,它会给你错误。