c# - 向参数提供某些值时生成编译器警告
问题描述
我正在用 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)。
解决方案
是的,使用 Roslyn 可以实现这一目标。我会创建两个分析器:
查看对 的所有调用
CheckThing()
。如果有人调用此方法并为其提供变量(而不是文字True
或False
),secureCheck
那么您的分析器将抛出错误。查看对 的所有调用
CheckThing()
。如果有人通过,False
则抛出您在问题中描述的警告。
您需要第一个分析器的原因是为了避免静态分析器无法确定作为secureCheck
. 例如,在以下过程中我们无法判断是否或是否True
被传入:False
var randomBool = (bool)Console.ReadLine();
var result = CheckThing(a, b, secureCheck: randomBool);
我已经有一段时间没有创建分析器了,但我相信您会挂接到编译事件并查找InvocationExpressionSyntax
. 然后,您将查看传递给此方法的参数并决定是否引发错误或警告。
推荐阅读
- html - Jquery:在弹出窗口中形成
- node.js - 为什么 Docker Hub 上的节点映像没有列出 11.x 版本的映像?
- windows - pip 安装错误,freetype 和 libpng 丢失(Windows)
- opendaylight - 哪些版本的 ODL 支持 l2switch?
- r - 计算R中特定年份的美国假期日期
- docker - Docker.service 无法启动,在 Raspbian 上出现错误“无法挂载覆盖:没有这样的设备”
- javascript - 在不刷新页面的情况下使用 json 数据填充表单中的选择元素选项
- arrays - 根据条件创建单独的数组元素
- r - 在 R 中生成 DNA 密码子组合
- c# - 将 Fody Costura 与 Entity Framework Core 迁移一起使用