2009-12-30 70 views
19

我有以下的自動屬性默認值屬性不符合我的自動屬性工作

[DefaultValue(true)] 
public bool RetrieveAllInfo { get; set; } 

,當我嘗試使用它的代碼我發現默認爲false是false裏面我認爲這是默認值一個bool變量,有沒有人有線索有什麼不對?!

+0

[Similar questions](http://stackoverflow.com/questions/705553/net-defaultvalueattribute-on-properties)。在VS2015中:'public bool RetrieveAllInfo {get;組; } = true;'這是[C#6](https://blogs.msdn.microsoft.com/csharpfaq/2014/11/20/new-features-in-c-6/)功能。 – marbel82 2016-11-08 13:17:06

回答

26

DefaultValue屬性僅用於告知Visual Studio設計器(例如,在設計表單時)屬性的默認值是什麼。它不會在代碼中設置屬性的實際默認值。

更多資訊:http://support.microsoft.com/kb/311339

+1

謝謝Philippe,所以我認爲唯一的解決方案是來自構造函數。謝謝 – 2009-12-31 06:39:21

11

[DefaultValue]僅由(例如)序列化的API(如XmlSerializer),和一些用戶界面元素(如PropertyGrid)。它沒有設置值本身;你必須使用一個構造函數爲:

public MyType() 
{ 
    RetrieveAllInfo = true; 
} 

或手動設置字段,即不使用自動實現的屬性:

private bool retrieveAllInfo = true; 
[DefaultValue(true)] 
public bool RetrieveAllInfo { 
    get {return retrieveAllInfo; } 
    set {retrieveAllInfo = value; } 
} 
0

一劈爲這是對this鏈接。

總之,在構造函數的末尾調用這個函數。

static public void ApplyDefaultValues(object self) 
    { 
     foreach (PropertyDescriptor prop in TypeDescriptor.GetProperties(self)) { 
      DefaultValueAttribute attr = prop.Attributes[typeof(DefaultValueAttribute)] as DefaultValueAttribute; 
      if (attr == null) continue; 
      prop.SetValue(self, attr.Value); 
     } 
    } 
+2

這是危險的,不應該使用。在派生類有機會設置使屬性設置器工作所需的任何內容之前,這會在基類構造函數完成之前設置派生類的屬性。 – hvd 2013-06-21 10:41:14