C# 关于源代码生成

这篇具有很好参考价值的文章主要介绍了C# 关于源代码生成。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

生成1:

步骤1:

首先建立一个控制台程序 SourceGeneratorDome1 选择版本.net7

代码如下:

// See https://aka.ms/new-console-template for more information
using GreetingTest;
Console.WriteLine("Hello, World!");
//Greeting.SayHelloTo("dyk");
les2_GreetingGeneratorMethod();
Console.ReadKey();


static void les2_GreetingGeneratorMethod() => GreetingUsePartialClass.SayHelloTo1("dyk");

建立类文 件  GreetingUsePartialClassm 这是一个类分布文件。

看清楚哟。这里只是定义了一个分布类和分布方法。具体实现方法通过源代码生成





namespace GreetingTest;


public static partial class GreetingUsePartialClass
{
    //public static void hello(string name)
    //{
    //    SayHelloTo1( name);
    //}
    public  static partial void SayHelloTo1(string name);
}

步骤2:建立一个源代码生成项目 但是类型选择. netstandard2.0  

项目名称:SourceGenerator.PartMethod

为什么选择. netstandard2.0 .主要是为了兼容性,因为其他版本可能生成代码用不了。或者出现一些莫名其妙问题。主要考虑代码向上兼容问题。

建立一个类文件 GreetingGeneratorMethod.cs 主要用于生成代码

注意:

1、[Generator(LanguageNames.CSharp)] 这个必须标识。否则不能生成代码。主要作用告诉编译器它要生成什么语言代码。这里是c# 也可以写成这样 [Generator("C#")]

2、.proj 必须加入 <LangVersion>preview</LangVersion> 否则告诉什么下面"""语法不支持

3、引入 Microsoft.CodeAnalysis.Common

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>netstandard2.0</TargetFramework>
	  <LangVersion>preview</LangVersion>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.CodeAnalysis.Common" Version="4.5.0" />
  </ItemGroup>

</Project>


namespace SourceGenerator.PartMethod
{

    /// <summary>
    /// 一定记得在项目配置文件加入
    ///  <LangVersion>preview</LangVersion>
    ///  否则会报错,AddSource 里字符串 什么语法7.3没法使用。
    ///  [Generator(LanguageNames.CSharp)]  获取 [Generator("C#")]都可以。
    ///  必须写则个特性。否则不会生成代码
    /// </summary>
    //[Generator("C#")]
    [Generator(LanguageNames.CSharp)]
    public class GreetingGeneratorMethod : ISourceGenerator
    {
        public void Execute(GeneratorExecutionContext context)
        {
            context.AddSource(
                "GreetingUsePartialClass.g.cs",
                $$"""
                //告知编译器,该文件由源代码生成器或别的手段生成的代码
                //<auto-generated/>
                //启用可空性检查。为C# 8 提供特性
                #nullable enable
                namespace GreetingTest;

                
                
                 public static partial class GreetingUsePartialClass
                 {
                   public  static partial void SayHelloTo1(string name)
                   {
                    global::System.Console.WriteLine($"Hello {name} 8886");
                   }
                 }
                
                
                """
                );


        }

        public void Initialize(GeneratorInitializationContext context)
        {
            
        }
    }
}

建立一个全局应用文件:GlobilUsing.cs

当然也可以不建立,因为可以直接在上一个文件头部引入。全局引入是某个版本新语法

global using System;
global using Microsoft.CodeAnalysis;

到这里代码是可以生成了。

步骤3:调用生成代码

接下在控制台调用源代码生成的代码:

1、首先引入源代码项目

    <ProjectReference Include="..\SourceGenerator.PartMethod\SourceGenerator.PartMethod.csproj" OutputItemType="Analyzer" ReferenceOutAssembly="false" />

注意:

OutputItemType="Analyzer" :指定编译的词法分析类型

ReferenceOutAssembly="false":告诉编译器。要使用源代码生成代码。如果这里涉及不是源代码生成代码 设置为true就可以。

控制台.proj

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net7.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
  </PropertyGroup>

  <ItemGroup>
   
    <ProjectReference Include="..\SourceGenerator.PartMethod\SourceGenerator.PartMethod.csproj" OutputItemType="Analyzer" ReferenceOutAssembly="false" />
  </ItemGroup>

</Project>

以上就可以做到,在控制台定义部分方法声明,然后让代码生成器去生成代码实现体。这是不是很方便。我们可以联想是不是可以用来做高级低代码编程工具啊。文章来源地址https://www.toymoban.com/news/detail-673070.html

到了这里,关于C# 关于源代码生成的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C#,字符串匹配(模式搜索)原生(Native)算法的源代码

    算法没什么可说的,就是一段一段匹配呗。 运行效果:  源代码: using System; using System.Collections; using System.Collections.Generic; namespace Legalsoft.Truffer.Algorithm {     /// summary     /// 字符串匹配(模式搜索)算法集锦     /// /summary     public static partial class PatternSearch     {   

    2024年02月01日
    浏览(44)
  • C#与VisionPro联合开发实例教程:详细步骤与源代码

    C#与VisionPro联合开发实例教程:详细步骤与源代码 在本教程中,我们将深入介绍如何使用C#编程语言与VisionPro图像处理软件进行联合开发。我们将通过一个完整的项目示例来演示此过程,包括详细的步骤和相应的源代码。 步骤1:环境准备 首先,确保你已经安装了以下软件:

    2024年02月06日
    浏览(52)
  • C#,字符串匹配(模式搜索)RK(Rabin Karp)算法的源代码

     M.O.Rabin Rabin-Karp算法,是由M.O.Rabin和R.A.Karp设计实现的一种基于移动散列值的字符串匹配算法。 通常基于散列值的字符串匹配方法:(1)首先计算模式字符串的散列函数;(2)然后利用相同的散列函数计算文本中所有可能的M个字符的子字符串的散列函数值并寻找匹配。但是

    2024年01月19日
    浏览(47)
  • C#中LINQ的使用知多少?LINQ常功能整理,实例源代码解析

      LINQ(Language-Integrated Query)是C#语言中的一个强大的查询技术,它提供了一种统一的查询语法,可以用于查询和操作各种数据源,包括集合、数据库、XML等。下面详细描述了LINQ的20个功能点,并提供了相应的源代码。 查询集合中的所有元素: 使用条件过滤集合中的元素:

    2024年02月05日
    浏览(52)
  • 网站转换APP源代码 WebAPP源代码 网站生成APP源代码 Flutter项目 带控制端

    源码介绍 一款网站转换成APP的源代码,开发语言使用Flutter,开发工具使用的是AndroidStudio,你只需要在APP源代码里面填写你的域名,即可生成即可生成APP,包括安卓或者苹果,与此同时我们提供了APP的控制端.你可以通过控制端设置APP的颜色、添加APP的图标、添加APP的菜单栏目。 添加

    2024年02月04日
    浏览(55)
  • C#,归并排序算法(Merge Sort Algorithm)的源代码及数据可视化

    归并算法采用非常经典的 分治策略 ,每次把序列分成n/2的长度,将问题分解成小问题,由复杂变简单。 因为使用了递归算法,不能用于大数据的排序。 核心代码: using System; using System.Text; using System.Collections.Generic; using System.Windows.Forms; namespace WindowsFormsApp6 {     public parti

    2024年02月02日
    浏览(57)
  • C#,数值计算,矩阵的乔莱斯基分解(Cholesky decomposition)算法与源代码

    安德烈·路易斯·乔尔斯基出生于法国波尔多以北的查伦特斯海域的蒙古扬。他在波尔多参加了Lycée e,并于1892年11月14日获得学士学位的第一部分,于1893年7月24日获得第二部分。1895年10月15日,乔尔斯基进入莱科尔理工学院,在当年223名入学学生中排名第88位。他在莱科尔理工

    2024年02月22日
    浏览(38)
  • C#,字符串匹配(模式搜索)KMP算法的源代码与数据可视化

      D.E.Knuth   J.H.Morris KMP 算法(Knuth-Morris-Pratt 算法)是其中一个著名的、传统的字符串匹配算法,效率比较高。 KMP算法由 D.E.Knuth , J.H.Morris 和 V.R.Pratt 在 Brute-Force 算法的基础上提出的模式匹配的改进算法。因此人们称它为“克努特—莫里斯—普拉特算法”,简称KMP算法。K

    2024年01月25日
    浏览(51)
  • C#,二进制数的按位旋转(Bits Rotate)算法与源代码

    二进制数的按位旋转(翻转)是编程中常见的按位运算方法。 二进制数的按位旋转分为左转、右转。 左转意味着数据变大,右转意味着数据变小(有损)。 using System; using System.Text; using System.Collections; using System.Collections.Generic; namespace Legalsoft.Truffer.Algorithm {     public static

    2024年02月19日
    浏览(40)
  • C#,二进制数的非0位数统计(Bits Count)的算法与源代码

    计算一个十进制数的二进制表示有多少位1? 使用循环按位统计1的个数。 利用一个数组或哈希生成一张表,存储不同二进制编码对应的值为1的二进制位数,那么在使用时,只需要去进行查询,即可在O(1)的时间复杂度内得到结果。 但是,此算法有个弊端,由于算法是采用空间

    2024年02月22日
    浏览(57)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包