代码自动生成
一. 创建源代码生成器
-
在netstandard2.0框架下创建源代码生成器项目
-
安装microsoft.codeanalysis.csharp (注意:版本兼容器)
-
项目配置增加
<!-- 是否强制执行扩展的分析规则 --> <EnforceExtendedAnalyzerRules>true</EnforceExtendedAnalyzerRules>
-
定义源代码生成类
实现1:常规实现(测试没有输出,问题未知)
类必须增加[Generator]标注
类必须继续自ISourceGenerator
a. Initialize 方法:
注册 SyntaxReceiver,以便在语法树中捕获节点。b. SyntaxReceiver 类:
实现 ISyntaxReceiver 接口,用于筛选语法节点及处理筛选出的语法节点,并可定义变量进行数据存储
OnVisitSyntaxNode 方法遍历语法树。c. Execute 方法:
接收SyntaxReceiver ,根据接收的SyntaxReceiver生成新的源代码并添加到编译上下文中。例:
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp.Syntax;
namespace SrouceCodeGen
{
[Generator]
public class SourceGenerator : ISourceGenerator
{
/// <summary>
/// 初始化源代码生成器
/// </summary>
/// <param name="context">初始化上下文,用于注册语法通知等</param>
public void Initialize(GeneratorInitializationContext context)
{
// 注册语法通知,当特定语法节点出现时进行处理
context.RegisterForSyntaxNotifications(() => new SyntaxReceiver());
}
/// <summary>
/// 执行源代码生成逻辑
/// </summary>
/// <param name="context">执行上下文,包含语法接收器等信息</param>
public void Execute(GeneratorExecutionContext context)
{
// 检查语法接收器是否正确并获取声明语法
if (context