代码生成场景
本文档提供常见代码生成场景的完整实现示例。
📋 文档信息
| 属性 | 值 |
|---|---|
| 难度 | 中级 |
| 阅读时间 | 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