审查生成的路由源生成器

来自 源生成器
C# 14 / .NET 10 高级 6分钟 找出 4处问题

在这个生成的实现被打包为分析器之前,对它进行审查。

为每个带标记的控制器生成一份确定性路由类,保留合法 C# 身份,避免构建期副作用,并维持逐控制器增量性。

csharp
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp.Syntax;

[Generator]
public sealed class RouteGenerator : IIncrementalGenerator
{
    public void Initialize(IncrementalGeneratorInitializationContext context)
    {
        var classes = context.SyntaxProvider.CreateSyntaxProvider(
            static (node, _) => node is ClassDeclarationSyntax,
            static (match, _) => (ClassDeclarationSyntax)match.Node)
            .Collect();
        context.RegisterSourceOutput(context.CompilationProvider.Combine(classes),
            static (output, pair) =>
            {
                foreach (var declaration in pair.Right)
                {
                    var symbol = pair.Left.GetSemanticModel(declaration.SyntaxTree).GetDeclaredSymbol(declaration)!;
                    string route = symbol.Name.Replace("Controller", "");
                    string source = $"public static class {symbol.Name}Routes {{ public const string Path = \"/{route}\"; }}";
                    System.IO.File.AppendAllText("generator.log", source);
                    output.AddSource("Routes.g.cs", source);
                }
            });
    } }

生成代码仅作示例,不代表任何特定模型

在试验场中打开
报告错误