2012-10-24 171 views
6

可能重複:
Setting the default value of a DateTime Property to DateTime.Now inside the System.ComponentModel Default Value Attrbute設置默認值的屬性在C#

進出口創造一個像日曆控件,我想用戶設置德元年他們想要查看。 但是如果他們不這樣做,那麼SelectedYear的屬性必須是實際的年份。

我嘗試設置這樣此默認值:

[DefaultValue(DateTime.Today.Year)] 
public int SelectedYear{ 
    get{ 
     return _selYear; 
    } 
    set{ 
     _selYear = value; 
     UpdateCalendar(); 
    } 
} 

而且我得到了以下錯誤

An attribute argument must be a constant expression, typeof expression or array creation expression of an attribute parameter type 
+0

這不是那個屬性的用途。在類的默認ctor中設置默認屬性值是一個常用選項。 – asawyer

+0

這是設計器的默認值,表示如果控件具有給定的年份值,則在屬性窗口中該值不會爲粗體。它不影響房產價值。 –

+0

如果您正在構建控件,那麼我相信在構造函數中設置默認值將是一個不錯的地方。 – jags

回答

6

DateTimeYear屬性是一個計算值,但你試圖把它嵌入到這是存儲在二進制一個不變的值的屬性。這兩個概念是不兼容的。

你想要在這裏做的是有一個標記,以指出該值尚未設置,並在這種情況下返回當前Year。這是使用一個可空

int? _selYear; 
public int SelectedYear { 
    get { return _selYear ?? DateTime.Today.Year; } 
    set { 
    _selYear = value; 
    UpdateCalendar(); 
    } 
} 
0

那麼,錯誤是相當清楚的:

的屬性參數必須是一個常數表達式...

那麼,如果沒有工作,默認值實際上是什麼?那麼,這將是您編譯代碼的一年。可能不是你想要的。

如果你真的想在默認情況下返回當前年份,那麼只需在構造函數中初始化它即可。

0

爲什麼不setbacking field,而不是像這樣的構造 -

_selYear = DateTime.Today.Year 

然後它將永遠是default值,如果用戶沒有設置。

0

DateTime.Today.Year不是一個恆定值的好地方,因爲它每年都會發生變化。您可以檢查是否_selYear已指定或不使用這樣的:

public int SelectedYear{ 
    get{ 
     if (_selYear.Equals(0)){ 
      return DateTime.Today.Year; 
     } 
     else{ 
      return _selYear; 
     } 
    } 
    set{ 
     _selYear = value; 
     UpdateCalendar(); 
    } 
} 

這是考慮到你開始_selYear 0

0

這是因爲DefaultValue只接受常量。你可以通過另一種方法做到這一點有點像下面

public int SelectedYear{ 
    get{ 
     return _selYear == 0 ? DateTime.Now.Year : _selYear; 
    } 
    set{ 
     _selYear = value; 
     UpdateCalendar(); 
    } 
} 

希望這會有所幫助!

1

您應該明確初始化屬性的值。 DefaultValue屬性不會通過它只提供元數據的值初始化屬性,該值是默認值。

你可以在一個類型的ctor中初始化它,或者你可以編寫一個自定義代碼來反映類型並通過類型元數據中的值初始化屬性。

3

使用AmbientValueAttribute表示當您將該屬性設置爲默認值時,它實際上意味着獲取當前日期。

int _selYear = 0; 

[AmbientValue(0)] 
[DefaultValue(0)] 
public int SelectedYear{ 
    get{ 
     if (_selYear == 0) 
      return DateTime.Today.Year; 
     return _selYear; 
    } 
    set{ 
     _selYear = value; 
     UpdateCalendar(); 
    } 
} 

如果你想使用0值,那麼你可以把它空的,但從來沒有返回null,只允許設置爲null:

int _selYear = null; 

[AmbientValue(null)] 
[DefaultValue(null)] 
public int? SelectedYear{ 
    get{ 
     return _selYear ?? DateTime.Today.Year; 
    } 
    set{ 
     _selYear = value; 
     UpdateCalendar(); 
    } 
} 

現在,它是代表空值今年。

的AmbientValueAttribute表示:如果此屬性設置爲值,當你的財產,另一個值將被從環境中回來,在這種情況下,返回值可能會有所不同,就像當前的日期。