精品秘无码一区二区三区老师-精品秘一区二三区免费雷安-精品蜜桃秘一区二区三区-精品蜜桃秘一区二区三区粉嫩-精品蜜桃一区二区三区-精品蜜臀国产aⅴ一区二区三区

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發文檔 其他文檔  
 
網站管理員

初識 C# 源代碼生成器,編寫代碼的代碼

admin
2025年1月3日 21:8 本文熱度 378

前言

嗨,大家好!

今天我們來聊一聊 C# 里的源代碼生成器,一個有趣的代碼生成工具。

源代碼生成器(Source Generators)是 C# 9.0 引入的一項強大功能,允許你在編譯時動態生成源代碼。

這意味著,你可以編寫代碼來自動生成其他代碼,從而減少手動重復的工作。

這個過程在編譯階段發生,生成的代碼會在編譯輸出中包含,從而使你的類庫或應用程序更輕便、更可維護。

首先我們通過一個 Step By Step 例子來感受一下它的魅力吧!

Step By Step 例子

我們來創建一個源生成器,它可以自動為一個類生成一個 ToString 方法,方便快速打印統一的對象信息

1. 創建項目

  • 在 Visual Studio 2022 IDE 中,創建一個新的類庫項目,命名為 SourceGen

  • 選擇 .NET Standard 2.0 版本,如圖:

2. 添加 NuGet 包

<PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="4.8.0" />

注意:

  1. 不要選擇太高的版本,否則可能會出現編譯器版本太高的問題,比如:

    分析器程序集“...”引用了編譯器的版本 “4.12.0.0”,該版本高于當前正在運行的版本 “4.8.0.0”
  2. 包 Microsoft.CodeAnalysis.CSharp 已經包含了 Microsoft.CodeAnalysis.Analyzers,所以無需繼續添加此包

3. 配置 EnforceExtendedAnalyzerRules 規則

打開項目文件 SourceGen.csproj,在 PropertyGroup 節點下手動增加 EnforceExtendedAnalyzerRules 配置,如圖:

4. 創建源生成器

在項目中,創建一個新的類文件,命名為 ToStringGenerator.cs,并編寫以下代碼:

using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.Text;
using System;
using System.Text;
using System.IO;
using System.Collections.Generic;
using System.Linq;
using System.Text.Json;
using Microsoft.CodeAnalysis.CSharp.Syntax;

namespaceSourceGen
{
    [Generator]
    publicclassToStringGenerator : ISourceGenerator
    {
        public void Execute(GeneratorExecutionContext context)
        {
            var syntaxTrees = context.Compilation.SyntaxTrees;

            foreach (var tree in syntaxTrees)
            {
                var root = tree.GetRoot();
                var classes = root.DescendantNodes().OfType<ClassDeclarationSyntax>();

                foreach (var classDeclaration in classes)
                {
                    // 獲取類名
                    var className = classDeclaration.Identifier.Text;
                    // 獲取類成員
                    var properties = classDeclaration.Members.OfType<PropertyDeclarationSyntax>();
                    var propertiesList = string.Join(", ", properties.Select(p => $"{p.Identifier.Text} = {{{p.Identifier.Text}}}"));

                    // 寫 ToString 方法
                    // 注意這里用了 partial 修飾符
                    var toStringMethod = $@"
public partial class {className} {{
    public override string ToString() => ""{className} {{{propertiesList}}}"";
}}
                "
;
                    context.AddSource($"{className}_ToString.g.cs", SourceText.From(toStringMethod, Encoding.UTF8));
                }
            }
        }

        public void Initialize(GeneratorInitializationContext context)
        {
            // 可以在這里初始化任何需要的對象或資源
        }
    }
}

編譯一下確定代碼沒問題。

5. 創建新控制臺項目

在解決方案中,添加一個新的控制臺項目,命名為 SourceGeneratorSample

6. 引用源代碼生成器項目 SourceGen

注意,引用后,需要打開 SourceGeneratorSample.csproj,修改項目引用節點內容,添加 OutputItemType 和 ReferenceOutputAssembly 配置:

<ProjectReference Include="..\SourceGen\SourceGen.csproj" 
                OutputItemType="Analyzer" 
                ReferenceOutputAssembly="false" />

7. 定義一個類

在 SourceGeneratorSample 項目中,創建一個簡單的類,例如 Person

public partial class Person
{
    public string? Name { getset; }
    public int Age { getset; }
}

注意:

  1. 不要放在任何命名空間下

  2. 使用 partial 修飾符

8. 使用源代碼器生成的方法

在 Program.cs 文件中,創建一個 Person 實例對象并打印它的 ToString

var person = new Person { Name = "Alice", Age = 30 };
Console.WriteLine(person.ToString()); 

9. 運行

按 Ctrl+F5 編譯并運行程序,你會在控制臺看到如下圖輸出:

優勢與劣勢

在上面的例子里,我們為項目中所有的類統一了 ToString 方法的輸出,從中我們可以看出一些源代碼生成器的優勢和劣勢:

優勢

  1. 減少重復勞動:源代碼生成器可以自動生成一些繁瑣的重復性代碼,特別是那些不變的基本數據結構或方法,比如數據傳輸對象(DTO)或實體類。

  2. 提高代碼一致性:生成的代碼遵循預設的邏輯,可以更好地保持一致性,減少了人為錯誤

  3. 保持代碼整潔:將生成的代碼與手寫的代碼分開,主代碼會顯得更加清晰易讀

劣勢

  1. 編譯時錯誤難以調試:因為代碼是在編譯階段生成的,如果生成的代碼有問題,定位和修復會相對比較困難

  2. 學習成本:源代碼生成器的概念和使用方式跟傳統開發方式差別比較大,需要一定的學習時間來掌握其使用方法

  3. 可能增加復雜性:源代碼生成器的實現需要對語法樹有深入的理解,這可能增加開發的復雜性。

  4. 版本兼容性:如果使用的源生成器依賴于特定版本的編譯器或框架,升級時可能會有兼容性的問題

總結

隨著 .NET 8 的發布,源代碼生成器這一強大特性也逐漸走進了更多程序員的視野。

相比傳統的 T4 模板等代碼生成工具,源代碼生成器的最大魅力在于它能在編譯時動態生成代碼。

這意味著你生成的代碼能立刻融入項目中,無需反復編譯,就像魔法一樣——寫完代碼馬上就能看到結果,大大提升了開發效率。

不過,任何好東西都有它的 “小脾氣”,源代碼生成器也不例外,有時候調試它很讓人抓狂,特別是如果你對語法樹不太熟悉的話,剛開始接觸時,可能會覺得有點棘手,需要花點時間去適應和學習。

所以呢,要不要在你的項目里引入這個強大的特性,其實取決于具體情況。如果你的項目適合并且你能接受一點初期的學習成本,那么源代碼生成器絕對會讓你的開發體驗煥然一新。但如果項目時間緊迫或團隊成員對它還不夠熟悉,可能就需要再三考慮一下啦。


該文章在 2025/1/6 10:15:30 編輯過
關鍵字查詢
相關文章
正在查詢...
點晴ERP是一款針對中小制造業的專業生產管理軟件系統,系統成熟度和易用性得到了國內大量中小企業的青睞。
點晴PMS碼頭管理系統主要針對港口碼頭集裝箱與散貨日常運作、調度、堆場、車隊、財務費用、相關報表等業務管理,結合碼頭的業務特點,圍繞調度、堆場作業而開發的。集技術的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業的高效ERP管理信息系統。
點晴WMS倉儲管理系統提供了貨物產品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質期管理,貨位管理,庫位管理,生產管理,WMS管理系統,標簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務都免費,不限功能、不限時間、不限用戶的免費OA協同辦公管理系統。
Copyright 2010-2025 ClickSun All Rights Reserved

主站蜘蛛池模板: 国产日韩精品欧美一区喷 | 伊人久久精品线影院 | 无码人妻一区二区三区免费 | 无码一区国产欧美在线资源 | 人体女人xx| 中文字幕亚洲中文字幕无码码 | 久久精品国产一区二区三区日 | 四虎影视在线视频大全免费观看 | 国产高清精品国语特黄A片 国产高清精品自在线看 | 国产91精品久久久久久久电影 | 亚洲AV无码成人精品久久 | 成人国产在线看不卡 | 日韩欧美在线国产一区二区 | 五月天国产亚洲av麻豆 | 日韩人妻少妇精品无码专区 | 久久精品成人免费观看三 | 色综合亚洲一区二区 | 特黄A又粗又大黄又爽A片 | 国产一区二区三区免费观看在线 | 亚洲av无码成人精品区狼人影院 | 亚洲成av人片在线观看无码麻豆 | 2025天堂中文字幕一区在线观 | 亚洲精品又粗又大又爽A片 亚洲精品在线第一页 | 亚洲 另类 春色 | 亚洲精品美女久久久久99 | 日韩精品内射视频免费观看 | 免费综合国产av一区二区三区天堂 | 亚洲成色www成人网站妖精 | 欧美成人H版泰山134 | 久久久精品一区aaa片 | 日本巨大的奶头在线观看 | 亚洲AV无码日产一区二区三区 | 自拍亚洲综合精品 | 粉色午夜视频 | 国产麻豆高清视 | 在线观看成人无码中文av天堂在线播放精品h精英 | 天美传媒mv免费观看英雄救美 | 97久久精品人人槡人妻人人玩 | 亚洲v高清一区二区三区尤物 | 久久99这里只有精品国产 | 国语精品91自产在线观看二区 |