新闻中心

C#如何使用Source Generators C#源生成器入门教程

2025-12-13
浏览次数:
返回列表
Source Generators 是 C# 9 引入的编译时代码生成技术,可在编译阶段自动生成 C# 源文件,不依赖反射、不修改原代码,生成代码具备完整 IDE 支持。

c#如何使用source generators c#源生成器入门教程

Source Generators 是 C# 9 引入的编译时代码生成技术,它能在编译阶段自动为你生成 C# 源文件,不依赖运行时反射,也不修改原始代码——生成的代码会和手写代码一样参与编译、有完整 IDE 支持(跳转、补全、调试)。

一、确认环境与项目结构

确保你使用的是 .NET 5 或更高版本(推荐 .NET 6+),且 SDK 支持 Source Generator。你需要两个项目:

  • 一个“生成器项目”(Class Library,目标框架为 netstandard2.0net6.0,引用 Microsoft.CodeAnalysis.CSharpMicrosoft.CodeAnalysis.Analyzers
  • 一个“使用项目”(如 Console App,引用生成器项目作为 Analyzer,不是普通 ProjectReference)

关键点:生成器项目必须声明为 <packagereference include="Microsoft.CodeAnalysis.CSharp" version="4.0.1" privateassets="all"></packagereference>,并在使用项目中用 <projectreference include="路径\Generator.csproj" outputitemtype="Analyzer" referenceoutputassembly="false"></projectreference> 引入。

二、编写最简 Source Generator

新建一个类实现 ISourceGenerator,重写 InitializeExecute 方法:

using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.Text;
using System.Text;
<p>[Generator]
public class HelloGenerator : ISourceGenerator
{
public void Initialize(GeneratorInitializationContext context) { }</p><pre class="brush:php;toolbar:false;">public void Execute(GeneratorExecutionContext context)
{
    var source = @"namespace Generated

{ public static class Greeting { public static string SayHello() => ""Hello from generator!""; } }"; context.AddSource("Greeting.g.cs", SourceText.From(source, Encoding.UTF8)); } }

注意:[Generator] 特性标记必不可少;AddSource 的文件名建议以 .g.cs 结尾,便于识别是生成代码;内容必须是合法 C# 语法,否则编译报错。

三、读取用户代码并生成响应式内容

真正实用的生成器需要分析用户代码。比如:扫描所有标记了 [AutoNotify] 的 partial class,自动生成 INotifyPropertyChanged 实现。

Playground AI Playground AI

AI图片生成和修图

Playground AI 99 查看详情 Playground AI
  • Initialize 中注册语法/语义回调(如 context.RegisterForSyntaxNotifications(() => new AutoNotifySyntaxReceiver())
  • 定义接收器类(ISyntaxContextReceiver)收集感兴趣节点(如 ClassDeclarationSyntax
  • Execute 中通过 context.Compilation 获取语义模型,检查 Attribute 应用情况
  • SyntaxFactory 或字符串模板拼出新代码,再 AddSource

小技巧:调试生成器较难,可先用 Debugger.Launch()(需在开发机上允许调试),或把生成逻辑抽成独立方法 + 单元测试验证输出字符串是否符合预期。

四、发布与复用(可选但推荐)

想让团队或 NuGet 上其他人使用?把生成器打包成 NuGet 包:

  • 生成器项目设置 <ispackable>true</ispackable>
  • .csproj 中添加 <none include="$(OutputPath)\$(AssemblyName).dll" pack="true" packagepath="analyzers/dotnet/cs"></none>
  • dotnet pack 打包,使用者安装该 NuGet 即自动启用生成器

无需额外配置,也不需要用户手动添加 ProjectReference —— 这是 NuGet 分发生成器的标准方式。

基本上就这些。Source Generator 不复杂但容易忽略细节:版本兼容性、引用方式、调试手段。写好一个能读属性、生成方法、支持泛型的生成器后,你会发现很多重复样板代码(如 DTO 映射、序列化契约、接口实现)都能自动化掉。

以上就是C#如何使用Source Generators C#源生成器入门教程的详细内容,更多请关注其它相关文章!


# 不依赖  # 山东网站建设案例  # 融水本地seo优化  # 湘潭网站建设学费  # 最新空开营销推广方案  # 榆林全网营销推广系统电话  # 网站建设推广价格实惠  # 旅游项目营销推广途径  # 毛纱厂家东莞网站建设  # 市北网络营销推广  # 出名的电商网站优化热线  # 有哪些  # app  # 这是  # 组策略  # 的是  # 编程语言  # 自动生成  # 注册表  # 也不  # 如何使用  # .net  # c#  # microsoft 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: J*a应用集成GitHub CLI与API认证指南  C++如何比较两个字符串_C++ string compare函数与操作符对比  J*a编写用户注册与登录功能_掌握字符串与验证逻辑  TikTok国际版官网直达_TikTok国际版官网直达进入在线观看  俄罗斯Yandex搜索引擎入口_Yandex官网免登录一键访问  12306怎么选座位选到安静区_12306选座安静区域选择策略  最新韩小圈网页版登录入口_官网在线观看官方链接  PHP高效扁平化嵌套数组:使用array_merge与数组解包操作符  Sublime怎么配置Nim语言环境_Sublime Nim代码高亮与补全  在VS Code中配置和运行Dart程序的完整步骤  QQ邮箱电脑版登录入口_QQ邮箱官方网站登录平台  如何使 Jest 模拟函数默认抛出错误以提高测试效率  12306几点到几点不能订票? | 官方最新系统维护时间全解析  vivo浏览器怎么扫描二维码 vivo浏览器内置扫一扫功能使用方法  Android Studio计算器C键逻辑错误排查与修复:条件判断优化指南  拼多多赚钱渠道_拼多多收益来源  QQ邮箱网页版邮箱入口 QQ邮箱官方登录平台  Python实时数据流中的动态最值查找策略  如何为你的Composer包编写自动化测试_集成PHPUnit到Composer的scripts工作流  Golang如何优雅处理error_Golang error处理最佳实践总结  微信网页版官方快速登录入口 微信网页版网页版账号直达  Composer的 archive 命令怎么用_快速打包你的PHP项目及其Composer依赖  CSS Flexbox如何实现多行排列_flex-wrap wrap自动换行显示  Django通过AJAX异步上传图片并保存至模型的完整指南  Win11 USB传输速度慢怎么解决 Win11 USB驱动更新与设置  夸克AO3官网入口_AO3镜像网站2025推荐  MAC怎么安装Homebrew包管理器_MAC为开发者和高级用户安装命令行工具  composer的"require-dev"部分是用来做什么的?  格力空气能E5故障代码是什么情况_格力空气能E5代码解析与应对措施  Flexbox布局实践:实现粘性导航栏与底部固定页脚  PDF文件体积过大处理_PDF压缩技巧详解  蛙漫漫画免费阅读入口_蛙漫官方正版无广告纯净版  如何优雅地扩展SprykerGlue后端API授权逻辑,使用spryker/glue-backend-api-application-authorization-connector-extension  夸克浏览器图书入口 夸克手机浏览器阅读入口  京东单号查询入口_京东快递订单追踪入口  在J*a里如何理解依赖关系的方向_依赖方向在模块结构中的作用  sublime如何处理大型CSV文件的列对齐_sublime高级表格编辑插件指南  Spring Boot内嵌服务器与J*a EE全栈特性:选择与部署策略  Angular中单选按钮的正确使用与常见陷阱解析  Surface怎么安装系统 微软Surface Pro U盘重装win11教程  使用 Pandas 高效处理 .dat 文件:数据清洗与数值计算实战  百度浏览器字体显示异常偏小_百度浏览器字体渲染修复方案  CSS子选择器:如何区分并样式化嵌套列表的子层级  Promise错误处理:在catch后终止链式then执行的策略  Lar*el Form Request中唯一性验证在更新操作中的正确实现  DLsite中文平台入口 DLsite官网内容在线查看  Go语言JSON解析深度指南:动态访问与结构体映射实践  163邮箱网页版入口导航平台 163邮箱网页版登录入口官网导航  “音游” × “怪文书” 题材的节奏冒险游戏 《晕晕电波症候群》确定于2026年4月发售!  NVIDIA股价11月重挫12%:下月有望好转 但难回5万亿美元巅峰 

搜索