将某些值提供给参数时生成编译器警告

时间:2019-05-19 04:43:30

标签: c# .net roslyn compiler-warnings .net-standard

我正在用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。 / p>

我想完成的是,只要将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)。

2 个答案:

答案 0 :(得分:0)

不认为此功能存在,我会将功能拆分为两个:

公共布尔CheckThingsSecured(){}

[已淘汰()] 公共布尔CheckThings(){}

答案 1 :(得分:0)

是的,罗斯林有可能实现这一目标。我将创建两个分析器:

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

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

您需要第一个分析器的原因是为了避免静态分析器无法确定将什么值作为secureCheck传递的情况。例如,我们无法确定在以下过程中是否传入了TrueFalse

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

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