2013-07-24 28 views
3

理論上可以在運行時查找中的consts嗎?在運行時在類中查找常量

我有一個靜態類完全與此類似consts的:

public static class Constants { 
    public const string Yes = "Yes"; 
    public const string No = "No"; 
} 

,我在想,如果我可以創建一個單元測試,可以採取常量類,並從在它讀取所有的consts的。這個想法是,我可以寫一個單元測試,然後針對所有的const字符串運行。所以如果我給這個類增加更多的字符串,單元測試不必改變。

我相信這裏的答案是否定的,但認爲這是值得問,以防萬一!

+0

查找到的反思(具體的例子爲常數:http://weblogs.asp.net/whaggard/archive/2003/02/20/2708.aspx) – SimpleVar

+0

什麼單元測試的類型你會寫常數嗎? –

+0

上面的類是微不足道的,但在實際的代碼中,常量指的是RegEx字符串,我們想要測試的字符串在編譯時是有效的。 – Nick

回答

5

嘗試是這樣的:

var t= typeof(Constants).GetFields(BindingFlags.Static | BindingFlags.Public) 
        .Where(f => f.IsLiteral); 
foreach (var fieldInfo in t) 
{ 
    // name of the const 
    var name = fieldInfo.Name; 

    // value of the const 
    var value = fieldInfo.GetValue(null); 
} 
+0

取代了。帶着;在第一行的結尾處,但除此之外逐字使用了此代碼。謝謝 – Nick

2

使用反射,你可以使用該領域的IsLiteral屬性,以確定它是否是一個常數:

var consts = myType.GetFields(BindingFlags.Static | BindingFlags.Public).Where(fld => fld.IsLiteral); 

然後,您可以做在你的單元測試與這些要求。

+0

我可能會誤解,但據我記得'IsLiteral'對'readonly'字段也是正確的,所以你需要測試'!fld.IsInitOnly'來過濾它們。 – Andrei