Skip to content

代码生成场景

本文档提供常见代码生成场景的完整实现示例。


📋 文档信息

属性
难度中级
阅读时间40 分钟
前置知识源生成器基础
相关文档代码生成 API索引

序列化生成器

JSON 序列化生成器

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

[Generator]
public class JsonSerializerGenerator : IIncrementalGenerator
{
    public void Initialize(IncrementalGeneratorInitializationContext context)
    {
        var classes = context.SyntaxProvider
            .ForAttributeWithMetadataName(
                "JsonSerializableAttribute",
                predicate: (node, _) => node is ClassDeclarationSyntax,
                transform: (ctx, _) => GetClassInfo(ctx))
            .Where(x => x != null);
        
        context.RegisterSourceOutput(classes, (spc, classInfo) =>
        {
            var code = GenerateSerializerCode(classInfo);
            spc.AddSource($"{classInfo.Name}_Serializer.g.cs", code);
        });
    }
}

Builder 模式生成器

流畅 API Builder

csharp
[Generator]
public class BuilderGenerator : IIncrementalGenerator
{
    public void Initialize(IncrementalGeneratorInitializationContext context)
    {
        var classes = context.SyntaxProvider
            .ForAttributeWithMetadataName(
                "GenerateBuilderAttribute",
                predicate: (node, _) => node is ClassDeclarationSyntax,
                transform: (ctx, _) => GetClassInfo(ctx))
            .Where(x => x != null);
        
        context.RegisterSourceOutput(classes, (spc, classInfo) =>
        {
            var code = GenerateBuilderCode(classInfo);
            spc.AddSource($"{classInfo.Name}Builder.g.cs", code);
        });
    }
}

ToString 生成器

自动 ToString 实现

csharp
[Generator]
public class ToStringGenerator : IIncrementalGenerator
{
    public void Initialize(IncrementalGeneratorInitializationContext context)
    {
        var classes = context.SyntaxProvider
            .ForAttributeWithMetadataName(
                "GenerateToStringAttribute",
                predicate: (node, _) => node is ClassDeclarationSyntax,
                transform: (ctx, _) => GetClassInfo(ctx))
            .Where(x => x != null);
        
        context.RegisterSourceOutput(classes, (spc, classInfo) =>
        {
            var code = GenerateToStringCode(classInfo);
            spc.AddSource($"{classInfo.Name}_ToString.g.cs", code);
        });
    }
}

关键要点

  • ✅ 使用 ForAttributeWithMetadataName 查找目标类
  • ✅ 使用增量生成器提高性能
  • ✅ 生成的代码应该是 partial 类
  • ✅ 添加适当的命名空间和 using 语句

相关文档


最后更新: 2026-02-06

基于 MIT 许可发布