2010-10-04 80 views
2

有沒有一種方法來遍歷所有屬性從一個類的構造函數中,所以我可以設置自己的所有默認值,而不必列出每一個像如何遍歷一個類的所有屬性?

this.prop1 = "?"; 
//repeat for each prop 

例如:

public class thisClass() 
{ 
    library() 
    { 
     foreach (property as p in thisClass) 
     { 
      p.value = "?"; 
     } 
    } 

public string prop1 {get; set;} 
public string prop2 {get; set;} 
etc. 
} 
+0

爲什麼你想這樣做?你的答案極大地影響了答案。 – Gabe 2010-10-04 20:54:15

+0

我有一個類應該都具有相同的默認值的許多屬性,但在閱讀了迴應並思考它之後,再一次在構造函數的一個屬性中設置默認值會更清晰。 – etoisarobot 2010-10-05 13:27:24

回答

6

你可以用Reflection(通過Type.GetPropertiesPropertyInfo.SetValue)來做到這一點,但我不會推薦它。它會降低可讀性和可維護性,並且會對性能產生負面影響。

列出屬性並定義它們的初始值的好處是,您可以在構造函數中看到它。或者,您可以爲您的屬性提供後臺字段,並在字段中內聯定義它們。

0

做這樣的事情。很棒。唯一的問題是你不能依靠訂單。

var properties = typeof(T).GetProperties(); 
foreach(var prop in properties){ 

} 

horses mouth所述的GetProperties方法不以特定的順序返回的屬性,如字母或聲明順序。您的代碼不得依賴於返回屬性的順序,因爲順序會有所不同。

這就是說,你的問題是更好的(如在軟件設計更好)通過手動分配所有屬性解決。如果您發現自己處於物業太多的情況,則應該使用容器。例如,A List<>

0

我不會推薦它,而是因爲你都在問:

var props = GetType().GetProperties().Where(prop => prop.CanWrite && prop.PropertyType == typeof(string)) 
foreach(var prop in props) 
    prop.SetValue(this, "?", null); 
+0

因私人設置屬性失敗。 – 2010-10-04 21:41:02

1

我不會做,真的。屬性應該由構造函數明確地初始化,這就是它們存在的原因。不要忘記初始化字段。

但我不知道爲什麼你需要它,所以這裏是一些代碼。

可靠地設置任何屬性(包括私有屬性)並不容易。通常我做這樣的(從我的頭,我會檢查我的真正的代碼明天):

var properties = this.GetType().Properties(
    BindingFlags.Instance 
    | BidningFlags.NonPublic 
    | BindingFlags.Public); 

foreach(PropertyInfo property in properties) 
{ 
    // if a property is declared on a base type with a private setter, 
    // get the definition again from the declaring type, 
    // unless you can't call the setter. 
    // Probably it is even more reliable to get the properties setter 
    // from the declaring type. 
    if (property.DeclaringType != this) 
    { 
     property = property.DeclaringType.GetProperty(
     property.PropertyName, 
     BindingFlags.Instance 
     | BidningFlags.NonPublic 
     | BindingFlags.Public); 
    } 

    if (property.CanWrite) 
    { 
     // assumed that you define a dictionary having the default values. 
     property.SetValue(this, defaultValues[property.PropertyType]; 
    } 
} 
0

我可能不會推薦所有的屬性設置爲null以外的固定值...尤其是隨着假設你的所有屬性都對這個默認狀態感到滿意,並且甚至更多,你的類的用戶很可能會期望空值(或者更確切地說,是default(T))代替未知值,這可能是天真的。

正如一個建議,如果這是爲了顯示「?」的好處,在特定值尚未知道的UI中,也許你可以在框架內使用合適的綁定類。

例如,winforms Binding類具有「NullValue」屬性,當數據源具有null或DbNull.Value時,它將被傳遞給綁定控件的屬性。

但是,如果你真的想沿着你所要求的路徑走,那麼就像上面所建議的那樣,Type.GetProperties()應該可以做到。確保您考慮繼承,抽象,重寫或虛擬屬性的情況,以及設置默認值是否合適 - 特別是考慮到標準設置/將值保留爲空值/默認值(T)的情況實際上有一個已知的價值。