根據現有 C#程式碼檔案生成擴充套件程式碼檔案的想法
看到這標題的朋友可能搞不懂到底在搞什麼,不過不要緊有興趣的朋友可以先了解一下IVsSingleFileGenerator到底是用來做什麼用的《實現自定義的VsSingleFileGenerator 》;在vs.net裡提供一個IVsSingleFileGenerator介面可以方便地為專案檔案生成附屬檔案,如剛才那文章提到的根據XML檔案自動生成一個附屬的C#程式碼檔案;當然這個IVsSingleFileGenerator並不只是針對XML檔案,可以是隨便為任何專案檔案生成附屬檔案你只要在檔案屬性中設定相關Custom Tools就可以了.
為什麼在這裡我提出在程式碼檔案的基礎上再生相關的程式碼附屬檔案呢,為什麼不直接在原始碼檔案寫完整就可以了;原因很簡單因為手寫程式碼是沒有電腦來得快,最主要一個原因是基於XML的IVsSingleFileGenerator在某方面不好所以才採用基於程式碼檔案的方式作為程式碼描述模板.用XML描述在現情況碰到的問題,在我的資料持久層裡是採用XML結合IVsSingleFileGenerator來生成相關實體類的.
內容大概如下:
<SmarkDatamodels xmlns="http://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="使用者密碼"/>
<Property Name="CustomerType" Type="System.Int32" Comment="客戶型別"/>
<Property Name="CustomerName" Type="System.String" Comment="自定義名"/>
<Property Name="Sex" Type="System.Boolean" Comment="性別"/>
<Property Name="Region" Type="System.String" Comment="地區"/>
<Property Name="City" Type="System.String" Comment="城市"/>
<Property Name="IDCard" Type="System.String" Comment="身份證號"/>
<Property Name="EMail" Type="System.String" Comment="電子郵件"/>
<Property Name="Phone" Type="System.String" Comment="電話"/>
Class>
SmarkDatamodels>
VsSingleFileGenerator會根據XML生成以下相關實體:
///
/// 使用者名稱
///
public virtual string UserName {
get {
return this.mUserName;
}
set {
this.mUserName = value;
this.EntityState.FieldChange("UserName");
}
}
///
/// 使用者密碼
///
public virtual string UserPWD {
get {
return this.mUserPWD;
}
set {
this.mUserPWD = value;
this.EntityState.FieldChange("UserPWD");
}
}
///
/// 客戶型別
///
public virtual int CustomerType {
get {
return this.mCustomerType;
}
set {
this.mCustomerType = value;
this.EntityState.FieldChange("CustomerType");
}
}
VsSingleFileGenerator有個不好的地方就是當主檔案修改後會重新生成附屬檔案,這樣就導致你無法修改程式碼檔案.如果想為某些屬性成員新增Attribute來處理一些功能基本是沒辦法的.
如新增成員資料驗證:
[NotNull]
[Length("5","16","使用者名稱長度必須在5-16個字元內!")]
public string UserName
{
get;
set;
}
即使能解決VsSingleFileGenerator生成附屬檔案衝突問題;但也要面對另一個問題,就如何擴充套件XML來處理這些擴充套件呢,新增XMLSchema擴充套件描述規則,重寫VsSingleFileGenerator程式碼生成部份;這樣下來沒多久我估計自己會瘋了....
實際情況新增不同Attribute來擴充套件輔助功能是很常見的事情,就一個驗證來說根據實際情況就有很多情況,類構造方式也不一樣.就針對這些情況來擴充套件XMLSchema和重寫VsSingleFileGenerator帶來的工作量就不用說了,還有一個問題就是XML並不能提供型別編譯的保證這樣對XML的質量是很難保證.
經過了一段時間的思考發現為什麼不直接用程式碼作為原模板呢,這樣就能得到IDE的支援,強在編譯器的支援下保證型別輸入規則的有效性.以下是本人實現的簡單生成模型:
[Table]
interface IUser
{
[ID]
string UserName { get; set; }
string BirthDate { get; set; }
string Region { get; set; }
string Remark { get; set; }
}
生成的相關程式碼
[Table]
[Serializable]
public class User:Smark.Data.Mappings.DataObject
{
[ID]
public string UserName { get{ return mUserName;} set{mUserName=value;EntityState.FieldChange("UserName");} }
private string mUserName;
public static Smark.Data.FieldInfo userName = new Smark.Data.FieldInfo("User","UserName");
public string BirthDate { get{ return mBirthDate;} set{mBirthDate=value;EntityState.FieldChange("BirthDate");} }
private string mBirthDate;
public string Region { get{ return mRegion;} set{mRegion=value;EntityState.FieldChange("Region");} }
private string mRegion;
public string Remark { get{ return mRemark;} set{mRemark=value;EntityState.FieldChange("Remark");} }
private string mRemark;
}
}
這樣的話即使我們如何給屬性新增Attribute都不會帶來程式碼上的修改,VsSingleFileGenerator只對屬性作一個模板生成其他內容搬過來就可以了:)
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-586876/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 根據api檔案生成程式碼API
- js根據字尾判斷檔案檔案型別的程式碼JS型別
- Java 根據模板生成 PDF 檔案 以及 excel 檔案JavaExcel
- 根據檔案查殺linux程式Linux
- windows下擴充套件yaf,並生成yaf框架檔案Windows套件框架
- Linux下擴充套件根檔案系統所在的分割槽Linux套件
- aix擴充套件檔案系統AI套件
- aix 擴充套件檔案系統AI套件
- 擴充套件資料檔案大小套件
- MATLAB生成.coe檔案和.mif檔案程式碼示例Matlab
- C#批量重新命名檔案程式碼的實現C#
- Linux 檔案系統擴充套件Linux套件
- 程式碼演示Mybatis-Generator 擴充套件自定義生成MyBatis套件
- 根據Golang定義的介面生成proto檔案Golang
- 根據不同瀏覽器視窗大小不同css檔案程式碼例項瀏覽器CSS
- spring boot itextPdf根據模板生成pdf檔案Spring Boot
- PHP根據wsdl生成呼叫soapwebservice程式碼PHPWeb
- php程式碼生成txt檔案並下載PHP
- LVM : 擴充套件檔案系統的容量LVM套件
- oracle 關閉資料檔案的擴充套件Oracle套件
- hyperf oss/cos 檔案上傳擴充套件套件
- macOS 探尋檔案擴充套件屬性Mac套件
- 回滾段擴充套件資料檔案套件
- python擴充套件檔案import失敗Python套件Import
- CheckBoxList擴充套件方法程式碼套件
- DocTemplateTool - 可根據模板生成word或pdf檔案的工具
- 一個根據資料庫自動生成model類的擴充套件資料庫套件
- Java程式碼實現下載檔案Java
- 根據編輯後的init.ora文字檔案內容重新生成spfile檔案
- 用Shell擴充套件實現原始碼統計程式套件原始碼
- 誰有檔案上傳的好的程式碼呢?
- 使用java程式碼啟動generator生成相關的檔案Java
- mybatis根據表逆向自動化生成程式碼MyBatis
- EF3.1 根據資料庫生成程式碼資料庫
- java快速實現匯出生成csv檔案(含註釋程式碼)Java
- nginx配置檔案語法高亮的Sublime Text擴充套件Nginx套件
- 寫擴充套件性好的程式碼:函式套件函式
- 程式碼安全之上傳檔案