繁体   English   中英

如果使用特定的枚举值,如何生成警告

[英]How to generate a warning if a specific enum value is used

我正在使用由第三方程序集公开的枚举,例如,

public enum APIEnum
{
  Val1,
  Val2
}

但是,许多这些值会导致我的应用程序中的行为不正确。 我想在代码中使用其中一个“坏”枚举值时生成编译器警告,例如,

APIEnum usedVal = APIEnum.Val2;

Compiler Warning: APIEnum.Val2 causes incorrect behavior.

我的最终目标是生成警告,如果使用了错误的值,则必须有意识地#pragma'd(占整个案例的2%)。 否则,会发出警告,因为我们将警告设置为错误,这会破坏编译直到修复或#pragma'd。

我看了线程这里这里使用过时的属性来解决这个问题,但我担心过时会造成混乱,因为该值是不是真的过时。

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

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

自定义代码分析规则的常用站点:

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

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

Introspector显示枚举类型

Methodcall也会看到Enum:

Introspector显示Assignment和Methodcall

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

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

我使用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语法未被抑制的枚举的使用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM