首页 > 编程语言 >c# .net 静态织入 代码生成 Source Generators

c# .net 静态织入 代码生成 Source Generators

时间:2023-04-04 18:46:21浏览次数:48  
标签:代码生成 partial string source c# void Source mainMethod context

  1. 必须创建 netstandard项目【ClassLibrary1】来存放代码生成接口
 [Generator]
    public class DemoSourceGenerator : ISourceGenerator
    {
        public void Execute(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);
        }

        public void Initialize(GeneratorInitializationContext context)
        {
            // No initialization required for this one
        }
    }
  1. 创建测试程序 - 控制台【ConsoleApp1】
partial class Program
    {
        static void Main(string[] args)
        {
            HelloFrom("Generated Code");
        }

        static partial void HelloFrom(string name);
    }
  1. 配置【ConsoleApp1】添加 OutputItemType="Analyzer" ReferenceOutputAssembly="false"
![](/i/l/?n=23&i=blog/944369/202304/944369-20230404183201456-1511027424.png)

  1. 运行得到结果
![](/i/l/?n=23&i=blog/944369/202304/944369-20230404183247836-1993282203.png)

Demo

[参考]
源生成器
抽丝剥茧!Source Generators原理讲解

标签:代码生成,partial,string,source,c#,void,Source,mainMethod,context
From: https://www.cnblogs.com/ives/p/17287373.html

相关文章

  • abc296-F
    题目链接:https://atcoder.jp/contests/abc296/tasks/abc296_f思维题,自己想的时候真没啥思路,看了很多题解才渐渐明白,也能大致证明正确性。前置知识:交换一个排列中的两个元素一次,会改变它的奇偶性。思路:1.当两个数组的数的数量都不相等时,肯定是不能使得他们相等的。2.当数组中......
  • GetNeighbourFaces逻辑
    classFilletRadiusDelegate:publicQItemDelegateclassFilletRadiusModel:publicQStandardItemModelclassDlgGetNeighborFaces:publicQWidget,publicGui::SelectionObserverclassGetNeighborFacesDialog:publicQDialogclassTaskGetNeighborFaces:p......
  • 深度学习基础-pytorch1
    DataSetDataLoaderTorchvision数据读取训练开始的第一步,首先就是数据读取。PyTorch为我们提供了一种十分方便的数据读取机制,即使用Dataset类与DataLoader类的组合,来得到数据迭代器。在训练或预测时,数据迭代器能够输出每一批次所需的数据,并且对数据进行相应的预处理与......
  • 在AspNet Core项目中集成Serilog
    1.引入Nuget包Serilog.AspNetCore2.配置SerilogusingSerilog;Log.Logger=newLoggerConfiguration().WriteTo.Console()//添加console日志输出.WriteTo.Debug()//添加debug日志输出.CreateLogger();try{Log.Information("Startingwebapplicat......
  • 记几次 [线上环境] Dubbo 线程池占满原因分析(第二次:CompletableFuture)
    转载:https://blog.csdn.net/wsmalltiger/article/details/124236189文章目录[线上环境]Dubbo线程池占满原因排查系列前言一、问题分析1、分析日志2、定位原因二、解决方案三、总结前言  某天早上9点左右收到线上故障报警,超过3个商家反馈“无法正常进入功能页面,点击相关操作提......
  • 记几次 [线上环境] Dubbo 线程池占满原因分析(第一次:HttpClient)
    转载:https://blog.csdn.net/wsmalltiger/article/details/124236055前言  我们一个核心应用,线上部署了4台机器(4c8g),某天晚上8点左右线上忽然出现dubbo线程池占满告警,上游应用error日志也疯狂报警,整个过程持续了4分钟左右系统自动恢复正常。  dubbo默认200个线程池,报错日志信......
  • sse eventsource
    这里不喂鸭~chatgpt的慢慢吐字的交互特别有意思,探索了一下,竟然看不到整个接口数据返回值(浏览器->网络)。细究发现是sse协议。fastapi后端使用方法:https://devpress.csdn.net/python/62f99ac5c6770329307fef71.html(其实这里面不能严格的看作是服务器推送,sse其实是一个http长连......
  • blockchain | 通过truffle编写合约
    blockchain|通过truffle编写合约有了前两篇环境搭建的基础,开始编写智能合约。(虽然部署了geth,但是truffle也有自带的私有链子环境可以用)参考官方文档:https://learnblockchain.cn/docs/truffle/quickstart.html#creating-a-project以及教程:https://www.qikegu.com/docs/4782......
  • 19.3 对FAT的支持(harib16c)
    19.3对FAT的支持(harib16c)问题:可以正确显示文件开头的512字节的内容,但大于512字节的部分不能正确显示(可能会显示其他文件)。问题本质:磁盘可能将大于512字节的文件离散的保存在不同磁盘中。解决办法:磁盘中保存了文件的下一段的地址。该记录(FAT,fileallocationtable,文件分配表)位......
  • 1、Clickhouse 单节点与集群部署
    一、单节点部署1.1、修改文件描述符 vim/etc/security/limits.conf*softnofile65536*hardnofile65536*softnproc131072*hardnproc131072 vim/etc/security/limits.d/20-nproc.conf*softnofile65536*hardnofile65536*softnproc131072*hard......