Я получил этот код в пользовательском элементе управления:
[DefaultValue(typeof(Color), "Red")]
public Color MyColor { get; set; }
Как изменить MyColor
как значение по умолчанию?
Я получил этот код в пользовательском элементе управления:
[DefaultValue(typeof(Color), "Red")]
public Color MyColor { get; set; }
Как изменить MyColor
как значение по умолчанию?
Это неформально, но вы можете использовать его посредством отражения, например, разместить в своем конструкторе следующее:
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);
}
}
}
DefaultValueAttribute
не устанавливает свойство в значение, оно чисто информационное. Дизайнер Visual Studio отобразит это значение как нежирное и другие значения, выделенные полужирным (измененным), но вам все равно придется установить свойство в значение в конструкторе.
Конструктор будет генерировать код для свойства, если значение было задано пользователем, но вы можете удалить этот код, щелкнув правой кнопкой мыши на свойстве и нажав Reset
.
DefaultValueAttribute
не используется компилятором и (возможно, смутно), он не устанавливает начальное значение. Вам нужно сделать это самостоятельно в конструкторе. Места, которые используют DefaultValueAttribute
, включают:
PropertyDescriptor
- предоставляет ShouldSerializeValue
(используется PropertyGrid
и т.д.)XmlSerializer
/DataContractSerializer
/и т.д. (механизмы сериализации) - для принятия решения о необходимости включенияВместо этого добавьте конструктор:
public MyType() {
MyColor = Color.Red;
}
(если это struct
с пользовательским конструктором, сначала нужно вызвать :base()
)
Атрибут "DefaultValue" не пишет для вас код... но он используется для того, чтобы вы рассказывали людям (например, г-н Property Grid или Mr Serializer Guy), что вы планируете установить значение по умолчанию для красного.
Это полезно для таких вещей, как PropertyGrid... поскольку он будет BOLD любого цвета, кроме Red... также для сериализации, люди могут отказаться от отправки этого значения, потому что вы сообщили им, что это значение по умолчанию:)
Вы инициализируете MyColor
в своем конструкторе?
Атрибут DefaultValue
фактически не устанавливает никаких значений. Он просто инструктирует конструктора, для которого значение не генерирует код, а также отображает значение по умолчанию, не содержащее жирным шрифтом, чтобы отразить это.
Я адаптировал ответ Йоссариана:
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);
}
}
}