源生成器是 C# 9 中引入的一項功能,允許在編譯過程中 動態生成程式碼 。
它們直接與 C# 編譯器整合(Roslyn)並在編譯時執行,分析原始碼並根據分析結果 生成附加程式碼 。
源生成器提供了一種簡化的自動化程式碼生成方法,無需外部工具或單獨的預編譯步驟。
透過無縫整合到編譯過程中,源生成器可以提高生產力、減少錯誤並實作更高效的開發工作流程。
如何使用
建立 .NET 控制台應用程式。此範例使用 .NET 6。將 Program 類替換為以下程式碼。
namespaceConsoleApp;
partial classProgram
{
staticvoidMain(string[] args)
{
HelloFrom("Generated Code");
}
staticpartialvoidHelloFrom(string name);
}
接下來,我們將建立一個源生成器計畫來實作 partial void HelloFrom 方法對應項。
建立一個以 netstandard2.0 目標框架名字物件為目標的 .NET 類別庫。添加以下 NuGet 包
<ItemGroup>
<PackageReferenceInclude="Microsoft.CodeAnalysis.CSharp"Version="4.8.0"PrivateAssets="all" />
<PackageReferenceInclude="Microsoft.CodeAnalysis.Analyzers"Version="3.3.4"PrivateAssets="all" />
</ItemGroup>
然後,建立一個名為 HelloS ourceGenerator.cs 的新 C# 檔,該檔指定你自己的源生成器,如下所示:
using Microsoft.CodeAnalysis;
namespaceSourceGeneratorInCSharp
{
[Generator]
public classSourceGenerator : ISourceGenerator
{
publicvoidExecute(GeneratorExecutionContext context)
{
// Find the main method
var mainMethod = context.Compilation.GetEntryPoint(context.CancellationToken);
// Build up the source code
string source = $@"// <auto-generated/>
using System;
namespace {mainMethod.ContainingNamespace.ToDisplayString()}
{{
public static partial class {mainMethod.ContainingType.Name}
{{
static partial void HelloFrom(string name) =>
Console.WriteLine($""Generator says: Hi from '{{name}}'"");
}}
}}
";
var typeName = mainMethod.ContainingType.Name;
// Add the source code to the compilation
context.AddSource($"{typeName}.g.cs", source);
}
publicvoidInitialize(GeneratorInitializationContext context)
{
// No initialization required for this one
}
}
}
現在,我們有一個正常執行的生成器,但需要將其參照到控制台應用程式。
新參照不是傳統的計畫參照,必須手動編輯以包含 OutputItemType 和 ReferenceOutputAssembly 內容。
<ItemGroup>
<ProjectReferenceInclude="..\SourceGeneratorInCSharp\SourceGeneratorInCSharp.csproj"
OutputItemType="Analyzer"
ReferenceOutputAssembly="false" />
</ItemGroup>
現在,執行控制台應用程式時,應會看到生成的程式碼執行並打印到螢幕。
控制台應用程式本身不實作 HelloFrom 方法,而是在編譯過程中從源生成器計畫生成的源。
如果使用的是 Visual Studio,則可以看到源生成的檔。
在「解決方案檔案總管」視窗中,展開「依賴項」>「分析器」>「SourceGenerator」>「SourceGenerator.HelloSourceGenerator」,然後雙擊「Program.g.cs」檔即可看到生成的內容。
https://learn.microsoft.com/zh-cn/dotnet/csharp/roslyn-sdk/source-generators-overview
關註我獲取技術分享