1. .NET源码生成器与partial范式开发实战
在.NET生态中,源码生成器(Source Generators)正逐渐成为提升开发效率的利器。它能在编译时动态生成C#代码,与partial类结合使用时尤其强大。最近我在一个企业级项目中实践了这种开发模式,并成功通过NuGet打包分发,过程中积累了不少实战经验。
partial类就像代码的"乐高积木",允许我们将一个类的实现分散到多个文件中。当与源码生成器配合时,这种特性变得尤为有用——生成器可以负责生成基础模板代码,而开发者则可以在另一个partial类中编写业务逻辑,两者在编译时自动合并。这种范式特别适合需要大量重复模板代码的场景,比如DTO对象、API客户端或者ORM实体类。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 源码生成器核心实现解析
2.1 创建基础生成器项目
首先需要创建一个标准的.NET类库项目,然后添加必要的NuGet包引用:
xml复制<ItemGroup>
<PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="4.3.1" />
<PackageReference Include="Microsoft.CodeAnalysis.Analyzers" Version="3.3.4" />
</ItemGroup>
生成器的核心是一个实现了ISourceGenerator接口的类。下面是一个基础模板:
csharp复制[Generator]
public class MySourceGenerator : ISourceGenerator
{
public void Initialize(GeneratorInitializationContext context)
{
// 注册语法接收器
context.RegisterForSyntaxNotifications(() => new MySyntaxReceiver());
}
public void Execute(GeneratorExecutionContext context)
{
// 获取语法接收器收集的信息
if (!(context.SyntaxReceiver is MySyntaxReceiver receiver))
return;
// 生成源代码逻辑
var sourceCode = GenerateSource(receiver);
// 添加生成的源代码
context.AddSource("GeneratedClass.g.cs", SourceText.From(sourceCode, Encoding.UTF8));
}
}
2.2 语法分析与代码生成
MySyntaxReceiver负责收集需要处理的语法节点。例如,我们要为所有带有特定特性的类生成扩展方法:
csharp复制class MySyntaxReceiver : ISyntaxReceiver
{
public List<ClassDeclarationSyntax> CandidateClasses { get; } = new();
public void OnVisitSyntaxNode(SyntaxNode syntaxNode)
{
if (syntaxNode is ClassDeclara
