2010-02-24 152 views
43

我聽到人們說的DefaultValue屬性的一些不同的東西,包括:.NET默認值屬性

  • 「它集之前什麼都使用它的屬性的值。」
  • 「它不適用於自動屬性。」
  • 「這只是裝飾,你必須手動設置實際的默認值。」

哪個(如果有的話)是正確的? DefaultValue實際上是否設置了默認值?有沒有不起作用的情況?最好不要使用它?

回答

45

我通常使用的地方DefaultValue適用於序列化/反序列化爲XML的類。它不是設置實例化過程中的默認值,並不影響自動屬性。

從MSDN:

甲DefaultValueAttribute不會造成構件與該屬性的值被自動初始化。您必須在代碼中設置初始值。

MSDN - DefaultValueAttribute Class


編輯:正如羅蘭指出,並在他們的答案中提到其他的屬性也使用窗體設計

+0

有用的事情。謝謝! – Aaron 2010-02-24 21:58:38

+1

不要忘了表單設計師也會使用它...... – 2010-02-24 22:01:04

1

「它設置屬性的前值其他任何東西都使用它。「 - >否默認值僅適用於設計人員。一個默認值不會被seralized到設計器代碼中。

「它不適用於自動屬性。」 - >否

「這只是裝飾,你必須手動設置實際的默認值。」 - >否。由於設計器序列化。但是你必須手動設置它。

11

與所有屬性一樣,它是元數據,因此「僅用於裝飾,您必須手動設置實際的默認值。」最近。

MSDN接着說約DefaultValueAttribute

一個DefaultValueAttribute不會造成一名成員與屬性的值被自動初始化。您必須在代碼中設置初始值。

ie您仍然需要使構造函數匹配您所說的默認值,以便信任它的代碼仍然有效,例如內置的XML序列化將使用它們來計算是否序列化屬性或不;同樣,表單設計人員將使用DefaultValue來確定需要自動生成的代碼。

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面向框架,如再思考或Postsharp。

10

到四年以後更新的:目前,設置JSON.net的DefaultValueHandling參數,使默認值的工作方式@aaron預期:

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

那麼這絕對有用! – Aaron 2014-06-18 18:25:22

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

不錯。如果爲每個_new_類型創建一個'Action'對象的靜態列表,並從'InitializePropertyDefaultValues()'調用它們,那麼只有當該類被初始化時,纔會將反射成本轉換爲一次。 – Suncat2000 2017-07-12 18:58:58