在这个生成的实现被打包为分析器之前,对它进行审查。
为每个带标记的控制器生成一份确定性路由类,保留合法 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);
}
});
} }
生成代码仅作示例,不代表任何特定模型