2011-03-03 82 views
2

有沒有辦法來檢查我的元素與elementtype類是否有他的繼承層次中的某個其他類?Stylecop - 我的繼承層次結構中有x類嗎?

我的用例是:我必須檢查我的例外是否帶有「Exception」前綴。要做到這一點,我必須以某種方式確定某個類是否是例外。我可以肯定的唯一方法就是它是否由Exception類本身繼承。

檢查基類類型是一個例外是很容易的,但是想象一下以下情形:

class GenericMathException : Exception{} 
class SpecificMathException : GenericMathException{} 

唯一的信息,我可以得到有關SpecificMathException是它的基類類型爲GenericMathException,但我可以」繼續進行繼承層次結構。

通常的反射方法也不能用,afaik。

那麼,任何人都必須處理這個問題,並找到了解決方案?或者有其他方法來識別異常?

在此先感謝。

+0

咦?這與StyleCop有什麼關係? – SLaks 2011-03-03 12:25:57

+0

這只是通過Stylecop行走代碼時的一個問題,而不是一般問題。這是造成這個問題的「外部觀點」。 – Cyfer 2011-03-03 12:32:40

+6

我假設他想創建一個StyleCop規則。但我認爲這將作爲一個FxCop規則更好。正如我所看到的那樣,StyleCop用於執行規則的是源文件級別和FxCop,它們位於已編譯的程序集級別。 – CodesInChaos 2011-03-03 12:32:52

回答

0

其本質上,StyleCop的確只適用於文件的內容,不能使用程序集本身的信息。

但是,如果您詢問「用於識別例外的替代方法」,那麼StyleCop+中的規則會執行與您的檢查非常接近的規則。您指定一個基類列表(默認爲Attribute,Exception,EventArgsStream),並確保從它們繼承的所有類的名稱以...Attribute,...Exception等結尾。

檢查按以下方式工作。如果基類的名稱以列表中的字符串結尾,則確保繼承類的名稱也應以相同的字符串結尾。例如,如果它遇到Class2 : InvalidOperationExceptionClass2 : SomeUnknownException,它將在兩種情況下引發違規。

假設你遵循這條規則,即使它們是多繼承的,你所有的繼承類也總是會被很好地命名。唯一不能用這種方法檢查的是,你處理的不是來自「你的」程序集的某些類,它已經違反了這條規則。例如,如果某個程序集有Class2 : Exception,並且您將此程序集引用爲二進制文件(並且沒有機會使用StyleCop進行檢查),那麼您將無法檢查從Class2繼承的Class3是否應以...Exception爲前綴。

但是實踐表明上一個問題相當少見,所以上述方法對於StyleCop非常適用。

+0

非常感謝,以這種方式實施。唯一遺留的是,如果碰巧有Class1:Exception和Class2:Class1,則只會看到屬於Class1的警告,並且一旦解決該問題,將在第二次運行中看到屬於Class2的警告。但無論如何,這種情況很難被接受。 – Cyfer 2011-03-07 12:40:43