我正在创建一个类似日历的控件,我希望用户设置他们想要查看的年份。 但如果他们不这样做,那么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 :(得分:6)
Year
的{{1}}属性是计算值,但您尝试将其嵌入到属性中,该属性是存储在二进制文件中的不可变值。这两个概念不兼容。
你想要做的是有一个标记,注意该值尚未设置,并在这种情况下返回当前DateTime
。这是一个使用可空的
Year
答案 1 :(得分: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表示:如果您将此属性设置为该值,当您获取该属性时,将从环境返回另一个值,并且在这种情况下返回值可能会有所不同,只是比如当前的日期。
答案 2 :(得分:1)
您应该显式初始化属性的值。 DefaultValue属性不会通过仅提供元数据的值初始化属性,该值是默认值。
您可以在类型的ctor中初始化它,或者您可以编写一个自定义代码,该代码将反映类型并通过类型元数据中的值初始化属性。
答案 3 :(得分:0)
嗯,错误很明显:
属性参数必须是常量表达式...
那么,如果那个 工作,那么默认值实际上是什么?好吧,这将是你编译代码的那一年。可能不是你想要的。
如果您确实希望默认返回当前年份,则只需将其初始化为构造函数中的那一年。
答案 4 :(得分:0)
为什么不set
backing field
而不是像构造函数中那样 -
_selYear = DateTime.Today.Year
如果用户没有设置它,它将永远是default
值。
答案 5 :(得分: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。
答案 6 :(得分:0)
这是因为DefaultValue
只接受常量值。你可以通过下面的其他方法来做到这一点
public int SelectedYear{
get{
return _selYear == 0 ? DateTime.Now.Year : _selYear;
}
set{
_selYear = value;
UpdateCalendar();
}
}
希望这会有所帮助!!