我已经使用 FxCop 方法对解决方案进行了原型设计,但我认为 FxCop 无法真正解决它。我在规则中尝试了以下代码:
public class DoNotUseSpecificEnum : RuleBase
{
private string[] _enumValsToCheck =
{
"APIEnum.Val2"
};
public DoNotUseSpecificEnum ()
: base("DoNotUseSpecificEnum ") { }
public override void VisitBinaryExpression(BinaryExpression binaryExpression)
{
if ( _enumValsToCheck.Contains(
binaryExpression.Operand1.ToString())
|| _enumValsToCheck.Contains( binaryExpression.Operand2.ToString() ) )
{
this.Problems.Add(new Problem(base.GetResolution(),
binaryExpression.SourceContext));
}
base.VisitBinaryExpression(binaryExpression);
}
}
当我追踪到 VisitBinaryExpression 时,我发现 Operand1 的值是“1”而不是“APIEnum.Val2”。事后看来,这是有道理的(FxCop 在 MSIL 上工作,它用数字文字替换了枚举名称/值);我只是希望我在深入了解自定义 FxCop 规则的痛苦/荣耀之前就已经意识到了这一点。:)
我发现的另一种方法是使用StyleCop进行语法分析,但这看起来比自定义 FxCop 规则更难弄清楚并且不太受欢迎。
我将建议使用 Resharper 团队特定的自定义模式作为管理方式。我仍然担心这种方法(特别是因为我们将在多个解决方案和团队中拥有相同的规则),但构建机器的关注比我想象的要小得多。TeamCity 允许开箱即用地对 Resharper 规则进行构建时检查,因此我们至少可以配置我们的 CI 服务器以查找和报告未使用 Resharper 语法抑制的枚举的使用情况。