2010-06-07 83 views
4

的默認值,讓我們假設我有一個類ClassWithMember獲取類成員

class ClassWithMember 
{ 
    int myIntMember = 10; 
} 

我如何獲得通過的System.Type的myIntMember成員的默認值10?

我目前正在與所有我retreive反射掙扎各地爲int(0)不是類默認成員(10)的默認值..

+1

10不是「默認值」。這只是場,這編譯因爲這是構造 – 2010-06-07 14:15:16

回答

2

嘗試創建一個實例的retreive與反思的價值。

+0

的一部分不情願,因爲我也用類(MonoBehaviour從Unity3D)指令的初始值是不能被實例化容易。 – 2010-06-07 14:01:19

+3

只是爲了闡述:任何整型的默認值是0,你的int到10的分配編譯爲在大蟒的分配指令,因此反射是你的選擇,除非你想重構爲「靜態只讀INT默認值= 10 「和」myIntMember = DefaultValue「 – 2010-06-07 14:03:23

+0

反射會很好,但我沒有達到按類型獲得此特定值的程度。 – 2010-06-07 14:10:29

4

你可以嘗試這樣的事情:

var field = typeof(ClassWithMember).GetField("myIntMember", 
    BindingFlags.Instance | BindingFlags.NonPublic); 
var value = (int)field.GetValue(new ClassWithMember()); 

這裏的竅門是實例化一個實例。

1

如果您控制着ClassWithMember的代碼,則可以採用完全不同的方法,方法是使用System.ComponentModel中的[DefaultValue]屬性。基本上,你會做的就是寫這樣的事情:

class ClassWithMember 
{ 
    public ClassWithMember() 
    { 
     SetDefaultValues(); 
    } 

    [DefaultValue(5)] 
    public MyIntMember { get; set; } 
} 

再有這樣的地方的功能,也許在一個基類:

public void SetDefaultValues() 
{ 
    foreach (PropertyDescriptor prop in TypeDescriptor.GetProperties(this)) 
    { 
     DefaultValueAttribute a = prop.Attributes[typeof(DefaultValueAttribute)] as DefaultValueAttribute; 
     if (a == null) 
      continue; 
     prop.SetValue(this, a.Value); 
    } 
} 

所以,您現在有一個情況您可以使用反射輕鬆檢索默認值。

請記住,這將是一個相當慢了很多,由於反射的要求,因此,如果這段代碼被實例化了很多,你可能會想找到一個不同的方法。此外,由於.NET Framework的屬性支持限制,它不適用於非值類型。

+0

看看這個approuch吧。但不幸的是,我無法控制每個班級。 – 2010-06-07 14:27:21