Skip to content

代码生成 API 完整参考

📋 文档信息

文档集: 代码生成 API
文档数量: 5 个
总阅读时间: 约 120 分钟
难度: 🟡 中级到 🔴 高级
前置知识:

  • C# 基础语法
  • Roslyn 基本概念
  • 语法树基础知识

适合人群:

  • 需要生成 C# 代码的开发者
  • 源生成器开发者
  • 代码分析工具开发者
  • 自动化代码生成工具开发者

🎯 概览

本文档集详细介绍 Roslyn 代码生成 API,包括 SyntaxFactory 的使用、代码构建模式、格式化技巧以及复杂结构的生成方法。

核心内容:

  • SyntaxFactory 基础: 学习如何使用 SyntaxFactory 创建基本语法元素
  • SyntaxFactory 高级: 掌握复杂结构的生成技术
  • 代码构建模式: 了解常用的代码构建模式和最佳实践
  • 格式化和美化: 学习如何格式化生成的代码
  • 最佳实践: 掌握代码生成的最佳实践和常见错误

典型应用场景:

  • 源生成器开发
  • DTO 类自动生成
  • Builder 模式代码生成
  • 代码重构工具
  • 代码模板生成
  • 测试代码生成

📚 文档列表

基础文档

文档难度阅读时间说明
SyntaxFactory 基础🟡 中级25 分钟学习 SyntaxFactory 的基本使用方法,包括创建类型、表达式和语句
格式化和美化🟢 简单15 分钟学习如何格式化和美化生成的代码

中级文档

文档难度阅读时间说明
代码构建模式🟡 中级20 分钟学习常用的代码构建模式,如构建器模式、流式 API 等
最佳实践🟡 中级25 分钟掌握代码生成的最佳实践、常见错误和性能优化技巧

高级文档

文档难度阅读时间说明
SyntaxFactory 高级🔴 高级35 分钟学习复杂结构的生成技术,包括泛型类、特性、接口实现等

🗺️ 学习路径

初学者路径

如果你是第一次接触 Roslyn 代码生成 API,建议按以下顺序学习:

  1. 第一步: 阅读 SyntaxFactory 基础

    • 了解 SyntaxFactory 的基本概念
    • 学习创建基本类型、表达式和语句
    • 掌握常用的 API 方法
  2. 第二步: 阅读 格式化和美化

    • 学习如何格式化生成的代码
    • 了解 NormalizeWhitespace 的使用
    • 掌握代码美化技巧
  3. 第三步: 阅读 代码构建模式

    • 学习构建器模式
    • 了解流式 API 设计
    • 掌握代码复用技巧
  4. 第四步: 阅读 最佳实践

    • 了解推荐做法
    • 避免常见错误
    • 学习性能优化技巧

进阶路径

如果你已经有一定的 Roslyn 基础,想要深入学习高级技术:

  1. 复习基础: 快速浏览 SyntaxFactory 基础
  2. 深入学习: 重点学习 SyntaxFactory 高级
    • 掌握泛型类生成
    • 学习特性和接口实现
    • 了解复杂结构生成技术
  3. 实战应用: 结合 代码构建模式最佳实践
    • 设计自己的代码生成架构
    • 优化代码生成性能
    • 处理复杂的生成场景

实战路径

如果你想快速上手实际项目:

  1. 快速入门: 浏览 SyntaxFactory 基础 的常用方法部分
  2. 选择模式: 根据需求选择 代码构建模式 中的合适模式
  3. 参考实践: 查阅 最佳实践 中的真实使用场景
  4. 深入优化: 根据需要学习 SyntaxFactory 高级 的特定技术

📊 API 速查表

常用类型创建

API说明返回类型示例
PredefinedType(Token(SyntaxKind.IntKeyword))创建预定义类型PredefinedTypeSyntaxint
IdentifierName("MyClass")创建自定义类型IdentifierNameSyntaxMyClass
GenericName(...)创建泛型类型GenericNameSyntaxList<int>
ArrayType(...)创建数组类型ArrayTypeSyntaxint[]
NullableType(...)创建可空类型NullableTypeSyntaxint?

常用表达式创建

API说明返回类型示例
LiteralExpression(...)创建字面量LiteralExpressionSyntax42, "Hello"
BinaryExpression(...)创建二元表达式BinaryExpressionSyntaxa + b
InvocationExpression(...)创建方法调用InvocationExpressionSyntaxMethod()
ObjectCreationExpression(...)创建对象创建ObjectCreationExpressionSyntaxnew MyClass()
MemberAccessExpression(...)创建成员访问MemberAccessExpressionSyntaxobj.Property

常用语句创建

API说明返回类型示例
LocalDeclarationStatement(...)创建变量声明LocalDeclarationStatementSyntaxint x = 42;
ExpressionStatement(...)创建表达式语句ExpressionStatementSyntaxMethod();
ReturnStatement(...)创建返回语句ReturnStatementSyntaxreturn value;
IfStatement(...)创建 if 语句IfStatementSyntaxif (condition) { }
ForStatement(...)创建 for 循环ForStatementSyntaxfor (int i = 0; i < 10; i++) { }

常用成员创建

API说明返回类型示例
PropertyDeclaration(...)创建属性PropertyDeclarationSyntaxpublic int Value { get; set; }
MethodDeclaration(...)创建方法MethodDeclarationSyntaxpublic void Method() { }
FieldDeclaration(...)创建字段FieldDeclarationSyntaxprivate int _field;
ConstructorDeclaration(...)创建构造函数ConstructorDeclarationSyntaxpublic MyClass() { }

常用修饰符

API说明示例
Token(SyntaxKind.PublicKeyword)public 修饰符public
Token(SyntaxKind.PrivateKeyword)private 修饰符private
Token(SyntaxKind.StaticKeyword)static 修饰符static
Token(SyntaxKind.ReadOnlyKeyword)readonly 修饰符readonly
Token(SyntaxKind.AbstractKeyword)abstract 修饰符abstract
Token(SyntaxKind.VirtualKeyword)virtual 修饰符virtual
Token(SyntaxKind.OverrideKeyword)override 修饰符override

💡 快速开始

最简单的示例

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

// 创建一个简单的属性
var property = PropertyDeclaration(
    PredefinedType(Token(SyntaxKind.IntKeyword)),
    Identifier("Value"))
    .AddModifiers(Token(SyntaxKind.PublicKeyword))
    .AddAccessorListAccessors(
        AccessorDeclaration(SyntaxKind.GetAccessorDeclaration)
            .WithSemicolonToken(Token(SyntaxKind.SemicolonToken)),
        AccessorDeclaration(SyntaxKind.SetAccessorDeclaration)
            .WithSemicolonToken(Token(SyntaxKind.SemicolonToken)));

// 格式化代码
var formattedProperty = property.NormalizeWhitespace();

// 输出代码
Console.WriteLine(formattedProperty.ToFullString());
// 输出: public int Value { get; set; }

常见使用场景

  1. 生成 DTO 类

    csharp
    // 详见: SyntaxFactory 高级 -> 真实使用场景 -> DTO 类生成器
  2. 生成 Builder 类

    csharp
    // 详见: SyntaxFactory 高级 -> 真实使用场景 -> Builder 模式生成器
  3. 生成测试代码

    csharp
    // 详见: 最佳实践 -> 真实使用场景

🔍 常见问题解答

Q1: SyntaxFactory 和字符串拼接哪个更好?

: 取决于场景:

  • 简单代码: 字符串拼接更简单直观
  • 复杂代码: SyntaxFactory 更安全、更易维护
  • 需要语法验证: 必须使用 SyntaxFactory

详见: SyntaxFactory 高级 -> 字符串插值 vs SyntaxFactory

Q2: 如何生成带命名空间的完整代码文件?

: 使用 CompilationUnitNamespaceDeclaration

csharp
var compilationUnit = CompilationUnit()
    .AddUsings(UsingDirective(IdentifierName("System")))
    .AddMembers(
        NamespaceDeclaration(IdentifierName("MyNamespace"))
            .AddMembers(classDeclaration));

详见: SyntaxFactory 高级 -> 常见问题解答 -> Q1

Q3: 生成的代码格式不正确怎么办?

: 使用 NormalizeWhitespace() 方法:

csharp
var formattedCode = syntaxNode.NormalizeWhitespace();

详见: 格式化和美化 -> NormalizeWhitespace

Q4: 如何提高代码生成性能?

: 主要优化方向:

  1. 重用 SyntaxToken
  2. 使用 StringBuilder 模式
  3. 避免不必要的格式化
  4. 批量生成代码

详见: 最佳实践 -> 性能优化技巧

Q5: 如何调试生成的代码?

: 推荐使用以下工具:

  1. Syntax Visualizer(Visual Studio 扩展)
  2. ToFullString() 方法输出代码
  3. 单元测试验证生成结果

详见: 最佳实践 -> 调试技巧


📖 相关文档

基础知识

API 参考

实战示例


🎯 学习目标

学习完本文档集后,你应该能够:

  1. 掌握 SyntaxFactory 基础

    • 创建各种类型、表达式和语句
    • 使用常用的 API 方法
    • 理解语法节点的结构
  2. 掌握代码格式化

    • 使用 NormalizeWhitespace 格式化代码
    • 控制代码缩进和换行
    • 生成美观的代码
  3. 掌握代码构建模式

    • 使用构建器模式组织代码
    • 设计流式 API
    • 实现代码复用
  4. 掌握高级生成技术

    • 生成泛型类和方法
    • 生成特性和接口实现
    • 处理复杂的代码结构
  5. 掌握最佳实践

    • 避免常见错误
    • 优化代码生成性能
    • 编写可维护的代码生成器

💡 实用技巧

技巧 1: 使用 using static 简化代码

csharp
using static Microsoft.CodeAnalysis.CSharp.SyntaxFactory;

// 之前
var property = SyntaxFactory.PropertyDeclaration(...);

// 之后
var property = PropertyDeclaration(...);

技巧 2: 使用 Add* 方法链式调用

csharp
var classDecl = ClassDeclaration("MyClass")
    .AddModifiers(Token(SyntaxKind.PublicKeyword))
    .AddMembers(property1, property2, method1);

技巧 3: 使用辅助方法封装常用操作

csharp
public static PropertyDeclarationSyntax CreateAutoProperty(
    string typeName, string propertyName)
{
    return PropertyDeclaration(
        IdentifierName(typeName),
        Identifier(propertyName))
        .AddModifiers(Token(SyntaxKind.PublicKeyword))
        .AddAccessorListAccessors(
            AccessorDeclaration(SyntaxKind.GetAccessorDeclaration)
                .WithSemicolonToken(Token(SyntaxKind.SemicolonToken)),
            AccessorDeclaration(SyntaxKind.SetAccessorDeclaration)
                .WithSemicolonToken(Token(SyntaxKind.SemicolonToken)));
}

技巧 4: 使用 Syntax Visualizer 查看语法结构

在 Visual Studio 中安装 ".NET Compiler Platform SDK",然后使用 "View -> Other Windows -> Syntax Visualizer" 查看代码的语法树结构。


🚀 下一步

完成本文档集的学习后,建议继续学习:

  1. 语义模型 API: 学习如何使用语义信息

  2. 增量生成器: 学习如何优化生成器性能

  3. 实战项目: 动手实践


📝 文档维护

最后更新: 2026-02-05
文档版本: 1.0
维护者: Roslyn 文档团队

如果你发现文档中的错误或有改进建议,欢迎提交反馈。


返回: API 参考首页

基于 MIT 许可发布