14

最近三天我一直在网上搜索,找不到任何关于这个问题的参考资料。我创建了一个自定义配置类以与我的 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"]; } }
    }
}
4

5 回答 5

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之后。

于 2013-05-13T13:45:16.407 回答
4

我能想到的两件事是使用 DefaultValue,如下所示:

    [ConfigurationProperty("customsettingitem", DefaultValue = -1)]
    public int CustomSettingItem { get { return (int)this["customsettingitem"]; } }

假设有一些无效的值。在这种情况下,CustomSettingItem == -1 表示未设置,>= 0 是在 config.xml 中设置的值。当然,这首先假设 -1 不是有效输入。

第二个想法是使用可为空的 int 代替:

    [ConfigurationProperty("customsettingitem", IsRequired = false)]
    public int? CustomSettingItem { get { return (int?)this["customsettingitem"]; } }

现在,如果在配置中没有设置任何内容,它应该默认为 null 而不是 0。

于 2009-02-20T03:10:42.140 回答
2

尝试以下操作:

configElement.ElementInformation.Properties[propName].ValueOrigin = 
        PropertyValueOrigin.SetHere

物业ValueOrigin告诉你价值从何而来。

于 2014-03-26T15:47:29.050 回答
0

到目前为止,如果配置文件中没有定义一个属性,我还不能告诉它为空。似乎在它的无限智慧中,当您键入 null 时,Microsoft 决定您的真正意思是 String.Empty 或 new 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; }
    }

这是一种黑客行为,会根据需要错误地标记该属性。如果您使用工具来编辑配置文件,则不会这样。

于 2011-01-06T14:35:40.053 回答
0

您还可以使用以下方法进行检查:

config.Setting1.CustomSettingItem.ElementInformation.IsPresent 

如果在您的配置文件中找不到它,它将给您错误。

于 2016-05-26T22:36:22.007 回答