c# - 使用 Roslyn 在编译时注入(inject)方法参数

标签 c# roslyn roslyn-code-analysis

我正在尝试了解 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 注释的参数值(就像我没有看到 CallerMemberNameCallerLineNumber 等)。

我希望 Roslyn 在编译时为我注入(inject)参数名称。

两者Source GeneratorsCode Generators只能添加源代码(不能更改)并编译。据了解,常规 Roslyn 分析器也会更改源代码。

知道 Roslyn 的这一部分是否可以公开访问以及我在哪里可以找到有关如何使用它的信息?


更新:我不想使用像 PostSharp 这样的 IL Weaver。只需教 Roslyn 将我的自定义属性视为 System.Runtime.CompilerService 属性之一即可。

最佳答案

关于c# - 使用 Roslyn 在编译时注入(inject)方法参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63428920/

相关文章:

c# - 当密码或用户名字段包含特殊字符时,System.Uri 无法解析

c# - 将时间序列模型与 PredictionEnginePool (ML.NET) 一起使用时 PredictionEngineBase 中出现异常

c# - 使用 Roslyn 创建部分类 - 一个在运行时编译的类

C# Roslyn 替换方法

roslyn - C# 代码分析 ProtectedAndInternal 与 ProtectedOrInternal

c# - 如何使用 Roslyn 获取方法调用/类声明的全名路径

c# - 使用 C# 在 ASP.NET 中解码条码图像

c# - 创建文件夹并将文件集复制到本地磁盘

c# - Roslyn Analyzer - 查找接口(interface)方法调用的当前具体实现

c# - 在 Roslyn 中获取表达式结果的类型