2011-03-03 65 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