属性上的.Net DefaultValueAttribute

时间:2009-04-01 13:45:56

标签: c# .net

我在用户控件中获得了此代码:

[DefaultValue(typeof(Color), "Red")]
public Color MyColor { get; set; }

如何将MyColor更改为默认值?

6 个答案:

答案 0 :(得分:21)

DefaultValueAttribute未将属性设置为值,它纯粹是信息性的。 Visual Studio设计器将此值显示为非粗体,其他值显示为粗体(已更改),但您仍需将属性设置为构造函数中的值。

如果该值是由用户设置的,设计人员将为该属性生成代码,但您可以通过右键单击该属性并单击Reset来删除该代码。

答案 1 :(得分:11)

编译器不使用

DefaultValueAttribute,并且(可能容易引起混淆)它不会设置初始值。你需要在构造函数中自己做这个。 执行使用DefaultValueAttribute的地方包括:

  • PropertyDescriptor - 提供ShouldSerializeValue(由PropertyGrid等使用)
  • XmlSerializer / DataContractSerializer / etc(序列化框架) - 用于决定是否需要包含

相反,添加一个构造函数:

public MyType() {
  MyColor = Color.Red;
}

(如果它是带有自定义构造函数的struct,则需要先调用:base()

答案 2 :(得分:7)

它是非正式的,但您可以通过反射使用它,例如,在构造函数中放置以下内容:

foreach (PropertyInfo p in this.GetType().GetProperties())
{
    foreach (Attribute attr in p.GetCustomAttributes(true))
    {
        if (attr is DefaultValueAttribute)
        {
            DefaultValueAttribute dv = (DefaultValueAttribute)attr;
            p.SetValue(this, dv.Value);
        }
    }
}

答案 3 :(得分:4)

“DefaultValue”属性不会为您编写代码...而是用于告诉人们(例如Mr Property Grid或Mr Serializer Guy)计划将默认值设置为红色。

这对于像PropertyGrid这样的东西很有用......因为它会 BOLD 除了红色以外的任何颜色......对于序列化,人们可能会选择省略发送该值,因为你通知了他们这是默认值:)

答案 4 :(得分:2)

您是否在构造函数中初始化了MyColor

DefaultValue属性实际上并未设置任何值。它只是指示设计者不生成代码的值,并且还会显示非粗体的默认值以反映这一点。

答案 5 :(得分:2)

我改编了Yossarian的答案:

foreach (PropertyInfo f in this.GetType().GetProperties())
{
    foreach (Attribute attr in f.GetCustomAttributes(true))
    {
        if (attr is DefaultValueAttribute)
        {
            DefaultValueAttribute dv = (DefaultValueAttribute)attr;
            f.SetValue(this, dv.Value, null);
        }
    }
}