2010-02-24 3 views
43

Я слышал, как люди говорят несколько различных вещей о атрибуте DefaultValue включая:.NET DefaultValue атрибут

  • «Он устанавливает значение свойства, прежде чем что-нибудь еще использует его.»
  • «Это не работает для автопромышленности».
  • «Это только для украшения. Вы должны вручную установить фактические значения по умолчанию».

Какой (если есть) правильный? Действительно ли DefaultValue устанавливает значения по умолчанию? Существуют ли случаи, когда они не работают? Лучше всего не использовать его?

ответ

45

Место, где я обычно использую DefaultValue, относится к классам, которые сериализуются/десериализуются в XML. Он не задает значение по умолчанию во время создания экземпляра и не влияет на автопроцессы.

Из MSDN:

DefaultValueAttribute не причинит элемент будет автоматически инициализируется со значением атрибута. Вы должны установить начальное значение в своем коде.

MSDN - DefaultValueAttribute Class


Edit: Как Роланд указывает, и как и другие упомянутые в своих ответах атрибут также используется конструктор форм

+0

Полезно знать. Благодаря! – Aaron

+1

Не забывайте, что дизайнер форм использует его также ... –

1

«Он устанавливает значение свойства перед все остальное использует его ». -> Нет значения по умолчанию для дизайнера. значение по умолчанию не будет серализоваться в коде конструктора.

«Это не работает для автопромышленности». -> Нет

«Это только для украшения. Вы должны вручную установить фактические значения по умолчанию». -> Нет. Из-за сериализации конструктора. Но вы должны установить его вручную.

11

Как и все атрибуты, это метаданные, и как таковые «Это только для украшения. Вы должны вручную установить фактические значения по умолчанию». ближе всего.

MSDN продолжает говорить о DefaultValueAttribute:

DefaultValueAttribute не причинит член будет автоматически инициализируется со значением атрибута. Вы должны установить начальное значение в своем коде.

т.е. Вам все еще нужно, чтобы сделать матч-конструктора, что вы говорите, это значение по умолчанию, так что код, который доверяет все еще работает, например, встроенные в XML сериализации будет использовать их, чтобы выработать ли сериализацию собственности или не; аналогично разработчик формы будет использовать DefaultValue s для определения того, какой код необходимо автоматически сгенерировать.

1

С MSDN помощью:

AttributeCollection^ attributes = TypeDescriptor::GetProperties(this)[ "MyProperty" ]->Attributes; 

/* Prints the default value by retrieving the DefaultValueAttribute 
     * from the AttributeCollection. */ 
DefaultValueAttribute^ myAttribute = dynamic_cast<DefaultValueAttribute^>(attributes[ DefaultValueAttribute::typeid ]); 
Console::WriteLine("The default value is: {0}", myAttribute->Value); 

Мне нужно установить значение атрибута по умолчанию для чего-то, не статики. Как я могу в принципе установить его, когда захочу?


Решено путем переопределения функций ShouldSerialize в классе, содержащем свойства.

Пример:

property System::String^ Z { 
      System::String^ get(){...} 
      void set(System::String^ value) {...} 
     } 

     bool ShouldSerializeZ() { 
      return Z != <call to run time objects> 
     } 
0

вы можете сделать этот вид магии происходит с Aspect Orientated рамочными, как второстепенные или PostSharp.

10

Чтобы обновить это через четыре года: В настоящее время настройки параметров Json.NET в DefaultValueHandling делает DefaultValue работать так, как ожидается, @aaron:

[JsonProperty("allowUploading",DefaultValueHandling = DefaultValueHandling.IgnoreAndPopulate)] 
[DefaultValue(true)] 
public bool AllowUploading { get; set; } 
+0

Ну, это определенно полезно! – Aaron

8

Вы на самом деле может «сила», чтобы работать на любом классе довольно легко.

Сначала вам нужно написать метод расширения объекта в системе имен:

public static class ObjectExtensions 
{ 
    public static void InitializePropertyDefaultValues(this object obj) 
    { 
     PropertyInfo[] props = obj.GetType().GetProperties(); 
     foreach (PropertyInfo prop in props) 
     { 
      var d = prop.GetCustomAttribute<DefaultValueAttribute>(); 
      if (d != null) 
       prop.SetValue(obj, d.Value); 
     } 
    } 
} 

Затем в конструкторе класса, который достаточно высоко в иерархии классов, которые на самом деле нуждаются в такой инициализации значение автоматического значения по умолчанию вы просто нужно добавить одну строку:

public MotherOfMyClasses() 
    { 
     this.InitializePropertyDefaultValues(); 
    } 
+0

Ницца. Если вы создаете статический список объектов «Action» для каждого типа _new_ и вызывают их из «InitializePropertyDefaultValues ​​()», это приведет к смещению стоимости отражения в одно время, только когда инициализируется класс. – Suncat2000

Смежные вопросы