我在用户控件中获得了此代码:
[DefaultValue(typeof(Color), "Red")]
public Color MyColor { get; set; }
如何将MyColor
更改为默认值?
答案 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);
}
}
}