首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

利用 IVsSingleFileGenerator 從 C# 程式碼產生擴充程式碼檔案

     編輯:關於C語言

前言:為什麼需要從程式碼產生程式碼?

在 Visual Studio 擴充開發中,IVsSingleFileGenerator 介面是一項強大功能,它允許開發者為專案中的任意檔案自動產生從屬(Dependent)檔案。最常見的案例是根據 XML 定義自動產生 C# 實體類別,但其實它不限於 XML,只要在檔案屬性中設定 Custom Tool,即可為任何專案項目產生對應的程式碼檔。

從 XML 到 C#:傳統做法的痛點

早期我在資料持久層專案中,採用 XML 搭配 IVsSingleFileGenerator 來產生實體類別。雖然可行,但 XML 描述結構較為冗長,且難以表達複雜的商業邏輯或驗證規則。例如,定義一個 Customer 類別需要撰寫大量 XML 標籤:

<SmarkDatamodels XMLns="https://SmarkData.cn/model.xsd" >
  <Class Name="Customer" Table="vp_Customer">
    <ID Name="CustomerID" Type="System.Int64"/>
    <Property Name="UserName" Type="System.String" Comment="使用者名稱"/>
    <Property Name="UserPWD" Type="System.String" Comment="使用者密碼"/>
    ...
  </Class>
</SmarkDatamodels>

產生器會依此輸出帶有屬性通知機制的 C# 程式碼:

/// <summary>
/// 使用者名稱
/// </summary>
public virtual string UserName {
    get { return this.mUserName; }
    set {
        this.mUserName = value;
        this.EntityState.FieldChange("UserName");
    }
}

改用 C# 程式碼作為範本的優勢

手寫程式碼遠不如電腦產生快速,且 XML 缺乏型別安全與 IntelliSense 支援。若改以 C# 程式碼本身作為描述範本,即可享有完整的編譯期檢查、重構支援與豐富的語法表達力。開發者只需撰寫核心定義(如屬性、關聯、驗證屬性),透過自訂的 Single File Generator 解析語法樹(Roslyn),即可自動產生完整的實體類別、資料存取介面、甚至單元測試骨架。

核心實作步驟

  1. 實作 IVsSingleFileGenerator 介面,重寫 Generate 方法。
  2. 在 Generate 中使用 Microsoft.CodeAnalysis (Roslyn) 解析輸入檔案的語法樹。
  3. 根據語法樹中的類別宣告、屬性、自訂屬性(Attribute)提取中繼資料。
  4. 使用 SyntaxFactory 動態建構目標程式碼的語法樹,並輸出為字串。
  5. 在專案檔案屬性中,將 Custom Tool 設定為你的產生器名稱(如 MyEntityGenerator)。

結語

以程式碼產生程式碼,不僅提升開發效率,更能確保產出程式碼的一致性與可維護性。下一篇將深入實作細節,示範如何利用 Roslyn 解析與產生語法樹。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved