3

我正在使用由第 3 方大会公开的枚举,例如,

public enum APIEnum
{
  Val1,
  Val2
}

. 但是,其中一些值会导致我的应用程序出现错误行为。如果在代码中使用这些“坏”枚举值之一,我想生成编译器警告,例如,

APIEnum usedVal = APIEnum.Val2;

Compiler Warning: APIEnum.Val2 causes incorrect behavior.

我的最终目标是生成一个警告,如果使用了错误的值(占总案例的 2%),则必须有意识地#pragma'd。否则,会出现警告,并且由于我们将警告作为错误,这会中断编译,直到修复或#pragma'd。

我已经在此处此处查看了有关使用 Obsolete 属性解决此问题的线程,但我担心 Obsolete 会引起混淆,因为该值并没有真正过时。

我已经考虑过使用 Resharper 代码分析插件来解决问题的可能性,这绝对是一种选择。我不是 Resharper 或如何通过 Resharper 最好地解决问题的专家。

4

3 回答 3

2

您可以为此创建自定义代码分析 (FxCop) 规则,或者确实推出您自己的 Resharper 规则。自定义代码分析规则应该相对简单,查看我的规则,它检查正则表达式是否编译RegexOptions,它找到了枚举的所有用途。您应该能够从那里构建自己的自定义规则。

自定义代码分析规则的一般优秀网站:

如果您在编写自己的规则时遇到困难,请不要犹豫,分享到目前为止的代码以寻求更具体的帮助。

使用 VisitAssignment 语句,然后使用assignment.Target.Type.FullName获取基础枚举类型。一定要检查 Target.Type 是否为空,委托可以有一个空类型。

显示枚举类型的内省

Methodcall 还将看到 Enum:

显示分配和方法调用的内省

于 2013-02-11T19:48:37.437 回答
2

您可以在 ReSharper 中使用结构搜索。转到ReSharper -> Options | Code Inspection -> Custom patterns,单击Add Pattern,输入APIEnum.Val2字段Search pattern并将您的错误描述输入Description。将模式严重性设置为Show as error。单击Add。就这样。唯一的缺点是如果您的项目中有另一个APIEnum具有相同Val2值的项目,即使在不同的命名空间中,它也会被标记为错误。

您还应该打开ReSharper -> Options | Code Inspection -> Settings | Analyse errors in whole solution以显示每个文件中的错误。

于 2013-02-11T19:58:52.233 回答
0

我已经使用 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 语法抑制的枚举的使用情况。

于 2013-02-14T06:39:13.330 回答