C# 属性上的.Net DefaultValueAttribute

C# 属性上的.Net DefaultValueAttribute,c#,.net,C#,.net,我在用户控件中获得了以下代码: [DefaultValue(typeof(Color), "Red")] public Color MyColor { get; set; } 如何将MyColor更改为其默认值?默认值属性没有将属性设置为该值,它纯粹是信息性的。VisualStudio设计器将此值显示为非粗体,其他值显示为粗体(已更改),但您仍必须将属性设置为构造函数中的值 如果该值是由用户设置的,则设计器将为该属性生成代码,但您可以通过右键单击该属性并单击重置来删除该代码。您是否正在初始化构

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

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

如何将
MyColor
更改为其默认值?

默认值属性
没有将属性设置为该值,它纯粹是信息性的。VisualStudio设计器将此值显示为非粗体,其他值显示为粗体(已更改),但您仍必须将属性设置为构造函数中的值


如果该值是由用户设置的,则设计器将为该属性生成代码,但您可以通过右键单击该属性并单击重置来删除该代码。您是否正在初始化构造函数中的MyColor

DefaultValue
属性实际上没有设置任何值。它只是指示设计器不为哪个值生成代码,还将显示默认值非粗体以反映这一点。

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


这对PropertyGrid之类的东西很有用。。。因为它会加粗除红色以外的任何颜色。。。同样对于序列化,人们可能会选择忽略发送该值,因为您告知他们这是默认值:)

DefaultValueAttribute
未被编译器使用,并且(可能令人困惑的是)它未设置初始值。您需要在构造函数中自己执行此操作。确实使用
DefaultValueAttribute
的位置包括:

  • PropertyDescriptor
    -提供
    ShouldSerializeValue
    (由
    PropertyGrid
    等使用)
  • XmlSerializer
    /
    DataContractSerializer
    /etc(序列化框架)-用于决定是否需要包含它
而是添加一个构造函数:

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

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

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

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);
        }
    }
}

我改编了尤萨林的答案:

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);
        }
    }
}

在给定的示例中,属性是针对属性而不是字段设置的。好吧,那么-rewrite-foreach(FieldInfo f在this.GetType().GetFields()中)作为foreach(PropertyInfo f在this.GetType().GetProperties()中)Wait wtf?为什么会被接受?如果这回答了您的问题,您需要重写您的问题