首页 > 解决方案 > 向参数提供某些值时生成编译器警告

问题描述

我正在用 C# 编写一个公共方法,它会执行某些非性能检查(出于安全原因)。

public bool CheckThing(int a, int b, bool secureCheck = true)
{
    if (secureCheck)
    {
        // do this thing slowly but safely
    }
    else
    {
        // do this as fast as possible
    }
    // ...
}

有时可能没有必要以“慢”的方式做事,我想让我的团队中知道自己在做什么的人将secureCheck值设置为false.

我想要完成的是让这个方法在secureCheck值设置为false(而不是如果它设置为 true)时调用此方法的行上抛出一个“编译器警告”。这样,知道自己在做什么的团队成员可以通过使用#pragma预处理器指令来确认警告:

#pragma warning disable InsecureCheckWarning // This call was checked by the team lead and is okay
var result = CheckThing(a, b, secureCheck: false)
#pragma warning restore InsecureCheckWarning 

这可能吗(可能使用 Roslyn)?如果是这样,我将如何实现这样的目标?

作为参考,这是一个 .NET Standard 2.0 库(虽然目前正在使用 C# 7.3,但如果需要,我不反对使用 C# 8.0)。

标签: c#.netroslyncompiler-warnings.net-standard

解决方案


是的,使用 Roslyn 可以实现这一目标。我会创建两个分析器:

  1. 查看对 的所有调用CheckThing()。如果有人调用此方法并为其提供变量(而不是文字TrueFalse),secureCheck那么您的分析器将抛出错误。

  2. 查看对 的所有调用CheckThing()。如果有人通过,False则抛出您在问题中描述的警告。

您需要第一个分析器的原因是为了避免静态分析器无法确定作为secureCheck. 例如,在以下过程中我们无法判断是否或是否True被传入:False

var randomBool = (bool)Console.ReadLine();
var result = CheckThing(a, b, secureCheck: randomBool);

我已经有一段时间没有创建分析器了,但我相信您会挂接到编译事件并查找InvocationExpressionSyntax. 然后,您将查看传递给此方法的参数并决定是否引发错误或警告。


推荐阅读