将默认值设置为c#上的属性

时间:2012-10-24 17:00:47

标签: c#

  

可能重复:
  Setting the default value of a DateTime Property to DateTime.Now inside the System.ComponentModel Default Value Attrbute

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

7 个答案:

答案 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();
    }
}

希望这会有所帮助!!