2012-09-04 27 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,但它似乎仍然有效。它说“静态检查器不使用反射来验证合同”。