我正在尝试了解 Roslyn 是否支持以下用例:
我使用 Guard
类进行参数验证
public void Foo(string bar)
{
Guard.NotNull(bar, nameof(bar));
// ....
}
没什么花哨的,nameof(...)
表达式甚至使它适合重构。但这仍然是多余的。没有什么可以阻止我做这样的事情
public void Foo(string bar, string baz)
{
Guard.NotNull(bar, nameof(baz));
// ...
}
因此,如果有一种方法可以完全避免 nameof(...)
部分,那就太好了。
因此,我想让 Roslyn 执行类似于 [CallerMemberNameattribute]
的操作,仅用于参数。
public static class Guard
{
public static void NotNull(object param, [CallerParameterName]string paramName = "")
{
if (param == null)
{
throw new ArgumentNullException(paramName);
}
}
}
public void Foo(string bar)
{
Guard.NotNull(bar);
// ...
}
我不想在编译之前更改代码(就像重构或代码修复一样)。我根本不想在源代码中看到用 CallerParameterNameAttribute
注释的参数值(就像我没有看到 CallerMemberName
或 CallerLineNumber
等)。
我希望 Roslyn 在编译时为我注入(inject)参数名称。
两者Source Generators和 Code Generators只能添加源代码(不能更改)并编译。据了解,常规 Roslyn 分析器也会更改源代码。
知道 Roslyn 的这一部分是否可以公开访问以及我在哪里可以找到有关如何使用它的信息?
更新:我不想使用像 PostSharp 这样的 IL Weaver。只需教 Roslyn 将我的自定义属性视为 System.Runtime.CompilerService 属性之一即可。
最佳答案
这是 C# 10 中的 [CallerArgumentExpression] 属性:
关于c# - 使用 Roslyn 在编译时注入(inject)方法参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63428920/