首页 > 其他分享 >使用 ForAttributeWithMetadataName 提高 IIncrementalGenerator 增量 Source Generator 源代码生成开发效率和性能

使用 ForAttributeWithMetadataName 提高 IIncrementalGenerator 增量 Source Generator 源代码生成开发效率和性能

时间:2024-04-26 09:00:27浏览次数:29  
标签:origin IIncrementalGenerator Generator 代码 ForAttributeWithMetadataName git 参数 源代

本文将告诉大家如何使用 ForAttributeWithMetadataName 方法用来提高 IIncrementalGenerator 增量 Source Generator 源代码生成的开发效率以及提高源代码生成器的运行效率

这是一个在 2022 的 6 月 15 才合入的新功能。原因是 Roslyn 团队发现了大量的源代码生成器和分析器项目都十分依赖 Attribute 的判断,且许多团队在实现的过程中都很难实现正确的增量方式,导致了许多多余浪费的计算,影响性能

使用 ForAttributeWithMetadataName 的方法非常简单,和 CreateSyntaxProvider 方法非常相似,只是添加了多了一个参数,这个参数就是所期望的 Attribute 名。假定正在编写的源代码生成器或分析器强依赖某个已知的特性,那通过 ForAttributeWithMetadataName 方法即可减少一些重复代码的编写和提升性能

代码例子如下

        var provider = context.SyntaxProvider.ForAttributeWithMetadataName("Lindexi.FooAttribute",
            // 进一步判断
            (node, _) => node.IsKind(SyntaxKind.ClassDeclaration),
            (syntaxContext, _) => syntaxContext.TargetSymbol.Name);

通过 ForAttributeWithMetadataName 方法,第一个参数传入所期望的特性名,第二个参数和第三个参数将和 CreateSyntaxProvider 的第一个第二个参数相同,只是传入的数据有所差别。此时的第二个参数的委托的 SyntaxNode 类型的对象就是已经标记了第一个参数的特性的成员,一般的进一步判断的代码都能简单,除非是有业务需要的过滤条件

以上的代码是过滤出所有标记了 Lindexi.FooAttribute 特性的类型

通过 ForAttributeWithMetadataName 方法可以由 Roslyn 底层尽量保持增量执行,也就是没有变更的情况下不会执行,可以很大提升性能

可以试试将这些类型添加到源代码生成里面。详细的代码可以通过下文获取所有的代码,获取的代码里面还包含了源代码生成的单元测试,可以运行单元测试内容了解具体的生成器输出以及进行调试

本文以上代码放在githubgitee 欢迎访问

可以通过如下方式获取本文的源代码,先创建一个空文件夹,接着使用命令行 cd 命令进入此空文件夹,在命令行里面输入以下代码,即可获取到本文的代码

git init
git remote add origin https://gitee.com/lindexi/lindexi_gd.git
git pull origin ed3de9582fa11bb0c9b0fd02e34d2c4f89c21df0

以上使用的是 gitee 的源,如果 gitee 不能访问,请替换为 github 的源。请在命令行继续输入以下代码

git remote remove origin
git remote add origin https://github.com/lindexi/lindexi_gd.git
git pull origin ed3de9582fa11bb0c9b0fd02e34d2c4f89c21df0

获取代码之后,进入 JijalnairhelecheNakallchijall 文件夹

更多关于源代码生成博客请参阅我的 博客导航

标签:origin,IIncrementalGenerator,Generator,代码,ForAttributeWithMetadataName,git,参数,源代
From: https://www.cnblogs.com/lindexi/p/18009107

相关文章

  • 使用 Visual Studio 调试 .NET 和 ASP.NET Core 源代码 | 学习地址
    使用VisualStudio调试.NET和ASP.NETCore源代码|MicrosoftLearn新建自签名证书|Microsoft学习AuthenticationHttpContextExtensions.ChallengeAsync方法(Microsoft.AspNetCore.Authentication)|MicrosoftLearn.netcore地址:  ASP.NETCore入门|Microsoft......
  • .NET Emit 入门教程:第六部分:IL 指令:8:详解 ILGenerator 指令方法:类型转换指令
    前言:经过前面几篇的学习,我们了解到指令的大概分类,如:参数加载指令,该加载指令以 Ld开头,将参数加载到栈中,以便于后续执行操作命令。参数存储指令,其指令以St开头,将栈中的数据,存储到指定的变量中,以方便后续使用。创建实例指令,其指令以New开头,用于在运行时动态生成并初始化对......
  • 2-77. 修正 CropGenerator 和 AStar 地图节点生成
    修复Bug可以看到房子的上面生成了一棵树修改CropGenerator修改AStar我不太理解,反正照着改就算了吧项目相关代码代码仓库:https://gitee.com/nbda1121440/farm-tutorial.git标签:20240413_1246......
  • .NET Emit 入门教程:第六部分:IL 指令:7:详解 ILGenerator 指令方法:分支条件指令
    前言:经过前面几篇的学习,我们了解到指令的大概分类,如:参数加载指令,该加载指令以 Ld开头,将参数加载到栈中,以便于后续执行操作命令。参数存储指令,其指令以St开头,将栈中的数据,存储到指定的变量中,以方便后续使用。创建实例指令,其指令以New开头,用于在运行时动态生成并初始化对......
  • 学习Source Generators之了解Source Generators的应用场景
    前面的文章我们都初步学习了SourceGenerators的使用方式以及做了一些简单的代码生成工具。但是SourceGenerators除了做自动代码生成之外,还能有别的应用场景,本文来了解一下SourceGenerators的应用场景。介绍SourceGenerators(源代码生成器)是.NET生态系统中的一项强大工具,它......
  • 学习Source Generators之打包成Nuget使用
    前面我们简单的实现了一个从swagger生成实体类的Generator,在实际使用中,通过nuget包引用使用会更方便,那么本篇文章将介绍如何将Generator打包成Nuget来使用。打包Nuget这里我们将GenerateClassFromSwagger.Analysis打包成Nuget进行使用。首先需要修改项目文件。修改项目文件在......
  • 码农必看:常见源代码混淆技术详解
    背景一、项目组代码部署存在的问题在项目组中,核心代码模块被部署于用户服务器上。然而,另一家公司获取了该服务器的root密码,这就存在着潜在的数据泄露和代码泄露的风险。传统的解决方法是通过配置环境变量来进行数据库加密处理,或者直接将jar包放到服务器上。然而,这些方法都......
  • 毕业设计3020微信小程序-图书馆图书借阅预览预约管理软件【源代码+文档+调试+讲解视频
    摘要本文详细介绍了基于服务器与客户端模式的图书馆图书借阅预览预约管理软件的设计与实现过程。服务器端具备学生管理、图书管理、自习室管理、自习室预约管理、图书借阅管理以及系统管理等功能,而客户端则为用户提供注册登录、首页浏览、图书借阅、自习室预约以及个人信息......
  • 基于ssm+vue.js的社区团购系统附带文章和源代码设计说明文档ppt
    文章目录前言详细视频演示具体实现截图技术栈后端框架SpringBoot前端框架Vue持久层框架MyBaitsPlus系统测试系统测试目的系统功能测试系统测试结论为什么选择我成功案例代码参考数据库参考源码获取前言......
  • 基于ssm+vue.js的高校学生实习管理系统附带文章和源代码设计说明文档ppt
    文章目录前言详细视频演示具体实现截图技术栈后端框架SpringBoot前端框架Vue持久层框架MyBaitsPlus系统测试系统测试目的系统功能测试系统测试结论为什么选择我成功案例代码参考数据库参考源码获取前言......