2010-11-10 68 views
6

我寫我自己的自定義配置部分,並有一個的ConfigurationElement定義的,就像這樣的ConfigurationProperty:意外RegexStringValidator衰竭定製的ConfigurationElement

[ConfigurationProperty("startTime", IsRequired = false)] 
[RegexStringValidator("\\d{2}:\\d{2}:\\d{2}")] 
public string StartTime 
{ 
    get 
    { 
     return (string) this["startTime"]; 
    } 

    set 
    { 
     this["startTime"] = value; 
    } 
} 

我期待着能夠進入的值,如「23 :30:00「在我創建的ConfigurationElement的startTime屬性中。但是,每當我嘗試加載我的配置節時,我都會收到ConfigurationErrorsException消息:

屬性'startTime'的值無效。錯誤是:該值不符合驗證正則表達式字符串'\ d {2}:\ d {2}:\ d {2}'。

我承認我總是用正則表達式的鬥爭,但是這是一個很簡單,我寫了一個測試,以驗證我的模式應該驗證類型的值,我期待:

var regex = new Regex(@"\d{2}:\d{2}:\d{2}", RegexOptions.Compiled); 
var isSuccess = regex.Match("23:30:00").Success; 

isSuccess的計算結果爲True,所以我不太確定爲什麼會拋出ConfigurationErrorsException。

作爲參考,這裏是從我的App.config文件我的配置部分:

<windowsServiceConfiguration> 
    <schedule startTime = "23:00:00" /> 
</windowsServiceConfiguration> 

任何幫助,爲什麼我不能得到RegexStringValidator工作,將不勝感激。謝謝。

+0

其實,我似乎有與一般的驗證問題。我與TimeSpanValidator有類似的問題。我裝飾一個屬性並設置一個範圍。配置文件中的值肯定在範圍內,我得到一個異常,說我的值超出範圍。 – Jed 2010-11-10 23:40:16

回答

15

嘗試定義的默認值,將通過驗證:

[ConfigurationProperty("startTime", IsRequired = false, DefaultValue = "00:00:00")] 
[RegexStringValidator(@"\d{2}:\d{2}:\d{2}")] 
public string StartTime 
{ 
    get 
    { 
     return (string) this["startTime"]; 
    } 

    set 
    { 
     this["startTime"] = value; 
    } 
} 
+0

謝謝!你的建議絕對使所有的驗證工作。 – Jed 2011-03-16 15:13:04

+0

+1 - 讓我補充一點,即使您已經在ConfigurationProperty上定義了(工作)默認值,您仍然需要在ConfigurationPropertyAttribute上定義一個默認值。 (但反過來說不對) – Paul 2012-01-05 02:43:14

+0

感謝您的幫助,有完全相同的問題,並添加一個默認值固定它。 – 2012-12-28 12:30:37

0

我不知道是否從屬性的間接方式需要雙重轉義的內容。如果是的話,而不是,:

"\\d{2}:\\d{2}:\\d{2}" 

使用:

@"\\d{2}:\\d{2}:\\d{2}" 

Ordinarly我認爲實在是太多了,但不妨一試。

+0

這太多了。模式「\\ d {2}:\\ d {2}:\\ d {2}」等同於@「\ d {2}:\ d {2}:\ d {2}」。還是)感謝你的建議。 – Jed 2010-11-10 23:37:02