2010-05-24 28 views
6

有沒有辦法對類或接口實現上的某些屬性強制執行編譯要求?如何在類定義上需要屬性?

例如,假設我的應用程序使用一系列包含const int資源值的靜態類。我想在Description屬性中修飾類以描述其內容。在概念上,我想將這個屬性需求應用到一個接口,然後每個靜態類將使用它的要求Description來實現它。我可以編寫運行時檢查或單元測試來檢查合規性。但編譯時檢查確實是最好的。

有這樣的事嗎?

回答

6

不,沒有這樣的事情。就我所知,單元測試是你可以做的最好的。

如果您可以自動識別類(通過名稱或類所裝飾的其他屬性),那麼您可以輕鬆地爲程序集中的所有類編寫單元測試。

+0

+1第二個單元測試,很容易編寫,雖然它不會讓編譯器抱怨,它會提前提醒你缺少信息。 – 2010-05-24 19:21:03

1

它可能在運行時通過反射。

這裏是你一個單元測試方法:

... 
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模式下執行。
(因爲反射速度不是很快,在生產模式下運行它真的沒有意義,是嗎?)

+0

在您的*單元測試*中針對生產代碼運行它是有意義的。你爲什麼要把它作爲條件,並將測試本身放在你的生產代碼中? – 2010-05-24 19:43:53

+0

@Jon - 我編輯它,現在它是一個單元測試。現在有意義嗎? :P – Venemo 2010-05-24 20:32:52

+0

除了你正在測試正在執行的程序集,這是一個單元測試程序集,因此不可能是你的生產代碼:)(我會使用'typeof(SomeWellKnownType).Assembly'。) – 2010-05-24 20:42:20

相關問題