在 Visual Studio 擴充開發中,IVsSingleFileGenerator 介面是一項強大功能,它允許開發者為專案中的任意檔案自動產生從屬(Dependent)檔案。最常見的案例是根據 XML 定義自動產生 C# 實體類別,但其實它不限於 XML,只要在檔案屬性中設定 Custom Tool,即可為任何專案項目產生對應的程式碼檔。
早期我在資料持久層專案中,採用 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");
}
}
手寫程式碼遠不如電腦產生快速,且 XML 缺乏型別安全與 IntelliSense 支援。若改以 C# 程式碼本身作為描述範本,即可享有完整的編譯期檢查、重構支援與豐富的語法表達力。開發者只需撰寫核心定義(如屬性、關聯、驗證屬性),透過自訂的 Single File Generator 解析語法樹(Roslyn),即可自動產生完整的實體類別、資料存取介面、甚至單元測試骨架。
IVsSingleFileGenerator 介面,重寫 Generate 方法。Generate 中使用 Microsoft.CodeAnalysis (Roslyn) 解析輸入檔案的語法樹。SyntaxFactory 動態建構目標程式碼的語法樹,並輸出為字串。MyEntityGenerator)。以程式碼產生程式碼,不僅提升開發效率,更能確保產出程式碼的一致性與可維護性。下一篇將深入實作細節,示範如何利用 Roslyn 解析與產生語法樹。