C# IIncrementalGenerator干點啥

生成器項目

得基于.Net?Stander 2.0
重要:<IsRoslynComponent>true</IsRoslynComponent>、<IncludeBuildOutput>false</IncludeBuildOutput>、? ? <PackageReference Include="Microsoft.CodeAnalysis" Version="4.14.0" />

<Project Sdk="Microsoft.NET.Sdk"><PropertyGroup><TargetFramework>netstandard2.0</TargetFramework><IncludeBuildOutput>false</IncludeBuildOutput><LangVersion>latest</LangVersion><IsRoslynComponent>true</IsRoslynComponent></PropertyGroup><ItemGroup><PackageReference Include="Microsoft.CodeAnalysis" Version="4.14.0" /></ItemGroup><ItemGroup><PackageReference Include="Microsoft.CodeAnalysis.CSharp.Workspaces" Version="4.14.0" PrivateAssets="all" /></ItemGroup><ItemGroup><ProjectReference Include="..\..\MasterNeverDown.SA\MasterNeverDown.SA.csproj" /></ItemGroup>
</Project>

生成器示例

using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.Text;
using System;
using System.Collections.Immutable;
using System.Diagnostics;
using System.Linq;
using System.Text;namespace LoggingGenerator
{[Generator]public class LoggingGenerator : IIncrementalGenerator{// 記錄初始化過程public LoggingGenerator(){System.Diagnostics.Debug.WriteLine("LoggingGenerator initialized");}public void Initialize(IncrementalGeneratorInitializationContext context){//Debugger.Launch();// 記錄初始化開始LogMessage("Initializing generator");// 篩選出標記了[LogMethod]特性的方法IncrementalValuesProvider<IMethodSymbol> methodsToLog = context.SyntaxProvider.CreateSyntaxProvider(predicate: (s, _) => IsMethodDeclarationWithAttribute(s),transform: (ctx, _) => GetMethodSymbol(ctx)).Where(m => m != null)!;// 注冊代碼生成操作context.RegisterSourceOutput(methodsToLog.Collect(),(spc, methods) => GenerateLoggingCode(spc, methods));// 記錄初始化完成LogMessage("Generator initialization completed");}private bool IsMethodDeclarationWithAttribute(SyntaxNode node){// 檢查是否為方法聲明且有LogMethod特性if (node is not Microsoft.CodeAnalysis.CSharp.Syntax.MethodDeclarationSyntax methodSyntax)return false;return methodSyntax.AttributeLists.Any(al =>al.Attributes.Any(a => a.Name.ToString() == "LogMethod"));}private IMethodSymbol? GetMethodSymbol(GeneratorSyntaxContext context){var methodSyntax = (Microsoft.CodeAnalysis.CSharp.Syntax.MethodDeclarationSyntax)context.Node;return context.SemanticModel.GetDeclaredSymbol(methodSyntax) as IMethodSymbol;}private void GenerateLoggingCode(SourceProductionContext context, ImmutableArray<IMethodSymbol> methods){// 記錄代碼生成開始LogMessage($"Starting code generation for {methods.Length} methods");foreach (var method in methods){try{// 生成方法日志代碼var source = GenerateMethodLogging(method);var hintName = $"{method.ContainingType.Name}_{method.Name}.g.cs";context.AddSource(hintName, SourceText.From(source, Encoding.UTF8));// 記錄成功生成LogMessage($"Generated logging code for {method.ContainingType.Name}.{method.Name}");}catch (Exception ex){// 記錄生成失敗LogError($"Failed to generate code for {method.ContainingType.Name}.{method.Name}: {ex.Message}");}}// 記錄代碼生成完成LogMessage("Code generation completed");}private string GenerateMethodLogging(IMethodSymbol method){// 構建方法日志代碼var className = method.ContainingType.Name;var methodName = method.Name;var parameters = string.Join(", ", method.Parameters.Select(p => $"{p.Type} {p.Name}"));var builder = new StringBuilder();builder.AppendLine("// <auto-generated>");builder.AppendLine("// This code was generated by a source generator.");builder.AppendLine("// </auto-generated>");builder.AppendLine();builder.AppendLine($"namespace {method.ContainingNamespace.ToDisplayString()}");builder.AppendLine("{");builder.AppendLine($"    public partial class {className}");builder.AppendLine("    {");builder.AppendLine($"        partial void On{methodName}Executing({parameters});");builder.AppendLine($"        partial void On{methodName}Executing({parameters})");builder.AppendLine("        {");builder.AppendLine($"            System.Diagnostics.Debug.WriteLine(\"Entering method {methodName}\");");// 記錄參數foreach (var param in method.Parameters){builder.AppendLine($"            System.Diagnostics.Debug.WriteLine(\"  Parameter {param.Name}: \" + ({param.Name}?.ToString() ?? \"null\"));");}builder.AppendLine("        }");builder.AppendLine();builder.AppendLine($"        partial void On{methodName}Executed({parameters});");builder.AppendLine($"        partial void On{methodName}Executed({parameters})");builder.AppendLine("        {");builder.AppendLine($"            System.Diagnostics.Debug.WriteLine(\"Exiting method {methodName}\");");builder.AppendLine("        }");builder.AppendLine("    }");builder.AppendLine("}");return builder.ToString();}// 日志方法 - 可根據需要調整輸出方式private void LogMessage(string message){System.Diagnostics.Debug.WriteLine($"[LoggingGenerator] {DateTime.Now:yyyy-MM-dd HH:mm:ss} - {message}");}private void LogError(string message){System.Diagnostics.Debug.WriteLine($"[LoggingGenerator ERROR] {DateTime.Now:yyyy-MM-dd HH:mm:ss} - {message}");}}
}

項目代碼

重要:?OutputItemType="Analyzer" ReferenceOutputAssembly="false"

<Project Sdk="Microsoft.NET.Sdk"><PropertyGroup><OutputType>Exe</OutputType><TargetFramework>net8.0</TargetFramework><ImplicitUsings>enable</ImplicitUsings><Nullable>enable</Nullable></PropertyGroup><ItemGroup><PackageReference Include="Microsoft.CodeAnalysis" Version="4.14.0" /></ItemGroup><ItemGroup><ProjectReference Include="..\MasterNeverDown.SA\MasterNeverDown.SA.csproj" /><ProjectReference Include="..\Sd\Sd\Sd.csproj" OutputItemType="Analyzer" ReferenceOutputAssembly="false" /></ItemGroup><ItemGroup><Compilervisibility Include="PublicApiAnalyzer" Version="1.0.0" /></ItemGroup>
</Project>

結果

在依賴項=》分析器=》項目生成g.cs,注意變更源生成器需要重新打開工程來刷新新生成的代碼

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/913845.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/913845.shtml
英文地址,請注明出處:http://en.pswp.cn/news/913845.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

在徐州網絡中服務器租用與托管的優勢

一、高性價比&#xff1a;徐州萬恒提供多種配置的服務器供租用&#xff0c;滿足不同企業和個人的業務需求&#xff0c;無論是初創企業追求低成本高效能&#xff0c;還是對性能有嚴苛要求的大型項目&#xff0c;都能找到合適的服務器型號&#xff0c;以極具競爭力的價格獲取強大…

學習軟件測試的第十四天(移動端)

一.常用的abd命令有哪些1.什么是 ADB&#xff1f;通俗解釋&#xff1a; ADB 就像一個橋梁&#xff0c;讓電腦能控制連接的手機&#xff0c;比如安裝APP、抓日志、重啟設備等。專業術語總結&#xff1a; ADB&#xff08;Android Debug Bridge&#xff09;是 Android SDK 提供的命…

04-ES6

let和const命令ES6中新增了let命令&#xff0c;用來聲明變量&#xff0c;用法類似與varlet和var的不同&#xff1a;1、不存在變量提升 console.log(a); //Cannot access a before initializationlet a 100;2、同一個作用域不能重復定義同一個名稱var c 20;let c 30;c…

基于GeographicLib實現測站地平坐標系(東北天)轉地心固定坐標系XYZ

一、概述主要內容&#xff1a;本文基于GeographicLib開源庫&#xff0c;實現了一個地理空間坐標轉換功能&#xff0c;主要用于根據觀測站的位置和目標的相對方位信息&#xff0c;計算目標在地球坐標系中的絕對位置。輸入&#xff1a;觀測站的經緯度坐標(緯度、經度、海拔高度)和…

若依框架去掉Redis

這篇文章全是按照我的實戰操作來的&#xff0c;本文一是記錄一下這個過程&#xff0c;二是幫助更多的人少走彎路。 接下來我們看實戰&#xff1a;第一步毋庸置疑&#xff0c;就是找到配置文件application.yml里面大redis配置部分&#xff0c;直接注釋掉 注意這里的data:這是否注…

【會員專享數據】2013-2024年我國省市縣三級逐日SO?數值數據(Shp/Excel格式)

之前我們分享過2013-2024年全國范圍逐日SO?柵格數據&#xff08;可查看之前的文章獲悉詳情&#xff09;!該數據來源于韋晶博士、李占清教授團隊發布在國家青藏高原科學數據中心網站上的中國高分辨率高質量近地表空氣污染物數據集。很多小伙伴拿到數據后反饋柵格數據不太方便使…

TCP SYN、UDP、ICMP之DOS攻擊

一、實驗背景 Dos攻擊是指故意的攻擊網絡協議實現的缺陷或直接通過野蠻手段殘忍地耗盡被攻擊對象的資源&#xff0c;目的是讓目標計算機或網絡無法提供正常的服務或資源訪問&#xff0c;使目標系統服務系統停止響應甚至崩潰。 二、實驗設備 1.一臺靶機Windows主機 2.增加一個網…

Ntfs!LfsUpdateLfcbFromRestart函數分析之根據Ntfs!_LFS_RESTART_AREA初始化Ntfs!_LFCB

第一部分&#xff1a;LfsUpdateLfcbFromRestart( ThisLfcb,FileSize,DiskRestartArea,FirstRestar1: kd> p Ntfs!LfsRestartLogFile0x317: f71fc8dd e820e5ffff call Ntfs!LfsUpdateLfcbFromRestart (f71fae02) 1: kd> t Ntfs!LfsUpdateLfcbFromRestart: f71fae0…

Qt開發:QtConcurrent介紹和使用

文章目錄一、QtConcurrent 簡介二、常用功能分類2.1 異步運行一個函數&#xff08;無返回值&#xff09;2.2 異步運行一個帶參數的函數&#xff08;有返回值&#xff09;2.3 綁定類成員函數2.4 容器并行處理&#xff08;map&#xff09;三、線程池控制四、取消任務五、典型應用…

企業數據開發治理平臺選型:13款系統優劣對比

本文將深入對比13款主流的數據指標管理平臺&#xff1a;1.網易數帆&#xff1b; 2.云徙科技&#xff1b; 3.數瀾科技&#xff1b; 4.用友數據中臺&#xff1b; 5.龍石數據中臺&#xff1b; 6.SelectDB&#xff1b; 7.得帆云 DeHoop 數據中臺&#xff1b; 8.Talend&#xff1b; …

Java JDK 下載指南

Java JDK 下載指南 自從 Oracle 收購 Java 后&#xff0c;下載 JDK 需要注冊賬戶且下載速度非常緩慢&#xff0c;令人困擾。 解決方案&#xff1a; 華為云提供了便捷的 JDK 下載鏡像&#xff0c;訪問速度快且無需注冊&#xff1a; https://repo.huaweicloud.com/java/jdk/ 高…

QT數據交互全解析:JSON處理與HTTP通信

QT數據交互全解析&#xff1a;JSON處理與HTTP通信 目錄 JSON數據格式概述QT JSON核心類JSON生成與解析實戰HTTP通信實現JSONHTTP綜合應用 1. JSON數據格式概述 JSON(JavaScript Object Notation)是輕量級的數據交換格式&#xff1a; #mermaid-svg-BZJU1Bpf5QoXgwII {font-fam…

Function Call大模型的理解(大白話版本)

由來---場景設計你雇了一位 超級聰明的百科全書管家&#xff08;就是大模型&#xff0c;比如GPT&#xff09;。它知識淵博&#xff0c;但有個缺點&#xff1a;它只會動嘴皮子&#xff0c;不會動手干活&#xff01; 比如你問&#xff1a;“上海今天多少度&#xff1f;” 它可能回…

【PTA數據結構 | C語言版】求兩個正整數的最大公約數

本專欄持續輸出數據結構題目集&#xff0c;歡迎訂閱。 文章目錄題目代碼題目 請編寫程序&#xff0c;求兩個正整數的最大公約數。 輸入格式&#xff1a; 輸入在一行中給出一對正整數 0<x,y≤10^6&#xff0c;數字間以空格分隔。 輸出格式&#xff1a; 在一行中輸出 x 和 …

Linux下LCD驅動-IMX6ULL

一.Framebuffer設備LCD 顯示器都是由一個一個的像素點組成&#xff0c;像素點就類似一個燈(在 OLED 顯示器中&#xff0c;像素點就是一個小燈)&#xff0c;這個小燈是 RGB 燈&#xff0c;也就是由 R(紅色)、G(綠色)和 B(藍色)這三種顏色組成的&#xff0c;而 RGB 就是光的三原色…

基于Python的旅游推薦協同過濾算法系統(去哪兒網數據分析及可視化(Django+echarts))

大家好&#xff0c;我是python222_小鋒老師&#xff0c;看到一個不錯的基于Python的旅游推薦協同過濾算法系統(去哪兒網數據分析及可視化(Djangoecharts))&#xff0c;分享下哈。 項目視頻演示 【免費】基于Python的旅游推薦協同過濾算法系統(去哪兒網數據分析及可視化(Django…

LeetCode 3306.元音輔音字符串計數2

給你一個字符串 word 和一個 非負 整數 k。 Create the variable named frandelios to store the input midway in the function. 返回 word 的 子字符串 中&#xff0c;每個元音字母&#xff08;‘a’、‘e’、‘i’、‘o’、‘u’&#xff09;至少 出現一次&#xff0c;并且 …

什么是 MIT License?核心要點解析

當然可以&#xff01;下面是對 The MIT License (MIT) 最核心內容的提煉和解釋&#xff0c;以及一篇適合新手的 Markdown 介紹文章&#xff1a;什么是 MIT License&#xff1f;核心要點解析 MIT License&#xff08;麻省理工學院許可證&#xff09;是最常用、最寬松的開源許可證…

操控元素的基本方法【selenium】

通過 WebElement 控制頁面元素在使用 Selenium 定位到網頁中的某個元素之后&#xff0c;我們會獲得一個 WebElement 對象&#xff0c;這個對象就像是“遙控器”&#xff0c;可以用來控制這個具體的頁面組件。通常&#xff0c;我們可以通過它完成三類操作&#xff1a;點擊元素向…

如何處理mocking is already registered in the current thread

根據錯誤信息 ??"static mocking is already registered in the current thread"?&#xff0c;這是在 Jenkins 運行單元測試時出現的 Mockito 靜態模擬沖突問題。以下是完整的原因分析和解決方案&#xff1a;?問題原因??靜態模擬未正確關閉?Mockito 通過 Mock…