2012-09-04 61 views
1

我可以在代碼合同構造中使用System.Reflection類和方法,它可以在靜態分析期間檢查嗎? 我想定義的合同那樣:在代碼合同中使用System.Reflection靜態分析

[ContractInvariantMethod] 
private void ObjectInvariant() 
{ 
    Contract.Invariant(GetType().GetMethods().Any(x => x.Name == "Add"),"Error"); 
} 

當我運行的應用程序,來檢查這個條件。 但在編譯過程中未檢查。 我可以以某種方式啓用這種合同的靜態檢查嗎?

回答

2

我不知道任何技術限制,但這不是最好的解決方案。代碼契約用於檢查運行時狀態或變化,而不是(有效)不可變的事物,例如類型上的方法。

相反,我要麼創建一個單元測試,檢查方法或在像FXCop這樣的靜態分析工具中創建規則。

+0

Thanks.Can我可以這樣定義一條規則:「如果MyClass派生自SomeBaseClass,它應該包含使用FxCop的MyClass類型的Field1 Field」。 – mao

+0

這可能與FXCop,但它可能是矯枉過正的問題中的例子。如果你想要求一個方法或屬性存在,就像Steven在他的回答中所說的那樣使用一個接口。如果您想確保方法不存在,就像在您的問題中一樣,使用反射的自動單元測試是最簡單的解決方案。 – akton

+0

我100%同意。代碼分析檢查二進制代碼。這不是類實例的契約,而是類的實現的二元(代碼分析)*規則*。 –

0

代碼合同並不意味着修復設計缺陷。你的課應該實現一個包含Add方法的接口。

+0

謝謝,但假設我不能以這種方式更改類的代碼(如實現接口或從抽象類繼承)。 – mao

+0

如果您可以在該類型上實現ObjectInvariant方法,則可以實現一個接口。否則,寫一個單元測試。這是編譯時檢查後最好的事情。 – Steven

0

以下是相當老的post,但它似乎仍然有效。它說「靜態檢查器不使用反射來驗證合同」。