2013-01-23 122 views
3

我已经创建了以下属性自定义配置节:自定义的ConfigurationSection默认布尔值

private const string UseMediaServerKey = "useMediaServer"; 
[ConfigurationProperty(UseMediaServerKey, IsRequired = false, DefaultValue = false)] 
public bool UseMediaServer 
{ 
    get { return bool.Parse(this[UseMediaServerKey] as string); } 
    set { this[UseMediaServerKey] = value; } 
} 

我的理解是,如果属性未在配置文件中定义,则DefaultValue应该返回。

但是,在上述情况下ArgumentNullException被抛出bool.Parse(...)意味着即使未定义配置属性也会执行默认访问器。

当然我可以改变属性访问到:

private const string UseMediaServerKey = "useMediaServer"; 
    [ConfigurationProperty(UseMediaServerKey, IsRequired = false)] 
    public bool UseMediaServer 
    { 
     get { 
      bool result; 
      if (bool.TryParse(this[UseMediaServerKey] as string, out result)) 
      { 
       return result; 
      } 

      return false; 
     } 
     set { this[UseMediaServerKey] = value; } 
    } 

不过,什么是DefaultValue属性点?

回答

8

this[UseMediaServerKey] as stringnull,因为该值的类型为bool,而不是string。您不必在自定义配置部分进行任何字符串转换:框架为您处理所有内容。

简化您的代码:

public bool UseMediaServer 
{ 
    get { return (bool) this[UseMediaServerKey]; } 
    set { this[UseMediaServerKey] = value; } 
} 

大功告成。如果配置文件中没有任何内容,则this[UserMediaServerKey]将返回DefaultValue正确类型。如果您必须更改字符串转换过程,请在配置属性上添加TypeConverterAttribute。但这不是必要的。