.Net DefaultValueAttribute on Properties

Я получил этот код в пользовательском элементе управления:

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

Как изменить MyColor как значение по умолчанию?

Ответ 1

Это неформально, но вы можете использовать его посредством отражения, например, разместить в своем конструкторе следующее:

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

Ответ 2

DefaultValueAttribute не устанавливает свойство в значение, оно чисто информационное. Дизайнер Visual Studio отобразит это значение как нежирное и другие значения, выделенные полужирным (измененным), но вам все равно придется установить свойство в значение в конструкторе.

Конструктор будет генерировать код для свойства, если значение было задано пользователем, но вы можете удалить этот код, щелкнув правой кнопкой мыши на свойстве и нажав Reset.

Ответ 3

DefaultValueAttribute не используется компилятором и (возможно, смутно), он не устанавливает начальное значение. Вам нужно сделать это самостоятельно в конструкторе. Места, которые используют DefaultValueAttribute, включают:

  • PropertyDescriptor - предоставляет ShouldSerializeValue (используется PropertyGrid и т.д.)
  • XmlSerializer/DataContractSerializer/и т.д. (механизмы сериализации) - для принятия решения о необходимости включения

Вместо этого добавьте конструктор:

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

(если это struct с пользовательским конструктором, сначала нужно вызвать :base())

Ответ 4

Атрибут "DefaultValue" не пишет для вас код... но он используется для того, чтобы вы рассказывали людям (например, г-н Property Grid или Mr Serializer Guy), что вы планируете установить значение по умолчанию для красного.

Это полезно для таких вещей, как PropertyGrid... поскольку он будет BOLD любого цвета, кроме Red... также для сериализации, люди могут отказаться от отправки этого значения, потому что вы сообщили им, что это значение по умолчанию:)

Ответ 5

Вы инициализируете MyColor в своем конструкторе?

Атрибут DefaultValue фактически не устанавливает никаких значений. Он просто инструктирует конструктора, для которого значение не генерирует код, а также отображает значение по умолчанию, не содержащее жирным шрифтом, чтобы отразить это.

Ответ 6

Я адаптировал ответ Йоссариана:

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