的默認值,讓我們假設我有一個類ClassWithMember獲取類成員
class ClassWithMember
{
int myIntMember = 10;
}
我如何獲得通過的System.Type的myIntMember成員的默認值10?
我目前正在與所有我retreive反射掙扎各地爲int(0)不是類默認成員(10)的默認值..
的默認值,讓我們假設我有一個類ClassWithMember獲取類成員
class ClassWithMember
{
int myIntMember = 10;
}
我如何獲得通過的System.Type的myIntMember成員的默認值10?
我目前正在與所有我retreive反射掙扎各地爲int(0)不是類默認成員(10)的默認值..
嘗試創建一個實例的retreive與反思的價值。
的一部分不情願,因爲我也用類(MonoBehaviour從Unity3D)指令的初始值是不能被實例化容易。 – 2010-06-07 14:01:19
只是爲了闡述:任何整型的默認值是0,你的int到10的分配編譯爲在大蟒的分配指令,因此反射是你的選擇,除非你想重構爲「靜態只讀INT默認值= 10 「和」myIntMember = DefaultValue「 – 2010-06-07 14:03:23
反射會很好,但我沒有達到按類型獲得此特定值的程度。 – 2010-06-07 14:10:29
你可以嘗試這樣的事情:
var field = typeof(ClassWithMember).GetField("myIntMember",
BindingFlags.Instance | BindingFlags.NonPublic);
var value = (int)field.GetValue(new ClassWithMember());
這裏的竅門是實例化一個實例。
如果您控制着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的屬性支持限制,它不適用於非值類型。
看看這個approuch吧。但不幸的是,我無法控制每個班級。 – 2010-06-07 14:27:21
10不是「默認值」。這只是場,這編譯因爲這是構造 – 2010-06-07 14:15:16