新闻中心
C#如何使用Source Generators C#源生成器入门教程
Source Generators 是 C# 9 引入的编译时代码生成技术,可在编译阶段自动生成 C# 源文件,不依赖反射、不修改原代码,生成代码具备完整 IDE 支持。

Source Generators 是 C# 9 引入的编译时代码生成技术,它能在编译阶段自动为你生成 C# 源文件,不依赖运行时反射,也不修改原始代码——生成的代码会和手写代码一样参与编译、有完整 IDE 支持(跳转、补全、调试)。
一、确认环境与项目结构
确保你使用的是 .NET 5 或更高版本(推荐 .NET 6+),且 SDK 支持 Source Generator。你需要两个项目:
- 一个“生成器项目”(Class Library,目标框架为 netstandard2.0 或 net6.0,引用
Microsoft.CodeAnalysis.CSharp和Microsoft.CodeAnalysis.Analyzers) - 一个“使用项目”(如 Console App,引用生成器项目作为 Analyzer,不是普通 ProjectReference)
关键点:生成器项目必须声明为 <packagereference include="Microsoft.CodeAnalysis.CSharp" version="4.0.1" privateassets="all"></packagereference>,并在使用项目中用 <projectreference include="路径\Generator.csproj" out 引入。
putitemtype="Analyzer" referenceoutputassembly="false"></projectreference>
二、编写最简 Source Generator
新建一个类实现 ISourceGenerator,重写 Initialize 和 Execute 方法:
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
AI图片生成和修图
99
查看详情
- 在
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万亿美元巅峰


2025-12-13
浏览次数:次
返回列表