生成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文章来源:https://www.toymoban.com/news/detail-673070.html
<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模板网!