有沒有辦法對類或接口實現上的某些屬性強制執行編譯要求?如何在類定義上需要屬性?
例如,假設我的應用程序使用一系列包含const int
資源值的靜態類。我想在Description
屬性中修飾類以描述其內容。在概念上,我想將這個屬性需求應用到一個接口,然後每個靜態類將使用它的要求Description
來實現它。我可以編寫運行時檢查或單元測試來檢查合規性。但編譯時檢查確實是最好的。
有這樣的事嗎?
有沒有辦法對類或接口實現上的某些屬性強制執行編譯要求?如何在類定義上需要屬性?
例如,假設我的應用程序使用一系列包含const int
資源值的靜態類。我想在Description
屬性中修飾類以描述其內容。在概念上,我想將這個屬性需求應用到一個接口,然後每個靜態類將使用它的要求Description
來實現它。我可以編寫運行時檢查或單元測試來檢查合規性。但編譯時檢查確實是最好的。
有這樣的事嗎?
不,沒有這樣的事情。就我所知,單元測試是你可以做的最好的。
如果您可以自動識別類(通過名稱或類所裝飾的其他屬性),那麼您可以輕鬆地爲程序集中的所有類編寫單元測試。
它可能在運行時通過反射。
這裏是你一個單元測試方法:
...
using System.Reflection;
using System.Diagnostics;
using System.Linq;
...
[TestMethod]
public void CheckAttributes()
{
var notAttributed = Assembly.GetAssembly(typeof(SomeClass))
.GetTypes()
.Where(t => t.GetCustomAttributes(typeof(MyAttribute), true).Count() == 0);
Assert.AreEqual<int>(0, notAttributed.Count());
}
哪裏MyAttribute
是你的屬性的類型,並且SomeClass
是要檢查裝配類。
您可能還需要過濾要以此方式檢查的類型。 (只有當你不需要每類在裝配使用該屬性,當然)。
如果你想這樣做在生產代碼,在其上放置一個Conditional("DEBUG")
屬性,以確保它僅在DEBUG模式下執行。
(因爲反射速度不是很快,在生產模式下運行它真的沒有意義,是嗎?)
在您的*單元測試*中針對生產代碼運行它是有意義的。你爲什麼要把它作爲條件,並將測試本身放在你的生產代碼中? – 2010-05-24 19:43:53
@Jon - 我編輯它,現在它是一個單元測試。現在有意義嗎? :P – Venemo 2010-05-24 20:32:52
除了你正在測試正在執行的程序集,這是一個單元測試程序集,因此不可能是你的生產代碼:)(我會使用'typeof(SomeWellKnownType).Assembly'。) – 2010-05-24 20:42:20
+1第二個單元測試,很容易編寫,雖然它不會讓編譯器抱怨,它會提前提醒你缺少信息。 – 2010-05-24 19:21:03