[英]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。
Methodcall也会看到Enum:
您可以在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.