6

可能重复:
在 System.ComponentModel 默认值属性中将 DateTime 属性的默认值设置为 DateTime.Now

我创建了一个像日历一样的控件,我希望用户设置他们想要查看的年份。但如果他们不这样做,则 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
4

7 回答 7

7

Year属性DateTime是一个计算值,但您试图将其嵌入到一个属性中,该属性是存储在二进制文件中的不可变值。这两个概念不兼容。

您在这里要做的是有一个标记来注意该值尚未设置,并Year在这种情况下返回当前值。这是使用可空值的好地方

int? _selYear;
public int SelectedYear {
  get { return _selYear ?? DateTime.Today.Year; }
  set { 
    _selYear = value;
    UpdateCalendar();
  }
}
于 2012-10-24T17:03:45.583 回答
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 值,则可以将其设为可空,但绝不返回空,只允许设置空:

int _selYear = null;

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

现在,它是表示当前年份的空值。

AmbientValueAttribute 的意思是:如果你把这个属性设置为那个值,当你得到这个属性时,会从环境中返回另一个值,并且这种情况下的返回值可能会有所不同,就像当前日期一样。

于 2012-10-24T17:14:58.743 回答
1

您应该显式地初始化属性的值。DefaultValue 属性不会通过值初始化属性,它只是提供默认值的元数据。

您可以在类型的 ctor 中对其进行初始化,也可以编写自定义代码来反映类型并通过类型元数据中的值初始化属性。

于 2012-10-24T17:06:52.070 回答
0

好吧,错误很明显:

属性参数必须是常量表达式...

那么,如果这确实有效,那么默认值实际上是什么?好吧,这将是您编译代码的那一年。可能不是你想要的。

如果您真的想默认返回当前年份,那么只需在构造函数中将其初始化为该年份即可。

于 2012-10-24T17:02:48.067 回答
0

为什么不在构造函数setbacking field改为这样 -

_selYear = DateTime.Today.Year

default如果用户没有设置它,它将始终是价值。

于 2012-10-24T17:03:20.700 回答
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。

于 2012-10-24T17:03:54.520 回答
0

这是因为DefaultValue仅接受常量值。您可以通过另一种方法来做到这一点,如下所示

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

希望这会有所帮助!

于 2012-10-24T17:04:28.757 回答