2012-10-24 173 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表示:如果此属性设置为值,当你的财产,另一个值将被从环境中回来,在这种情况下,返回值可能会有所不同,就像当前的日期。