熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

根據現有C#代碼文件生成擴展代碼文件

2013-11-13 10:02:03  來源: .NET編程 

  為什麼在這裡我提出在代碼文件的基礎上再生相關的代碼附屬文件呢為什麼不直接在原代碼文件寫完整就可以了;原因很簡單因為手寫代碼是沒有電腦來得快最主要一個原因是基於XML的IVsSingleFileGenerator在某方面不好所以才采用基於代碼文件的方式作為代碼描述模板用XML描述在現情況碰到的問題在我的數據持久層裡是采用XML結合IVsSingleFileGenerator來生成相關實體類的

  內容大概如下:
<SmarkDatamodels xmlns= >

  <Class Name=Customer Table=vp_Customer>

  <ID Name=CustomerID Type=SystemInt/>

  <Property Name=UserName Type=SystemString Comment=用戶名/>

  <Property Name=UserPWD Type=SystemString Comment=用戶密碼/>

  <Property Name=CustomerType Type=SystemInt Comment=客戶類型/>

  <Property Name=CustomerName Type=SystemString Comment=自定義名/>

  <Property Name=Sex Type=SystemBoolean Comment=性別/>

  <Property Name=Region Type=SystemString Comment=地區/>

  <Property Name=City Type=SystemString Comment=城市/>

  <Property Name=IDCard Type=SystemString Comment=身份證號/>

  <Property Name=EMail Type=SystemString Comment=電子郵件/>

  <Property Name=Phone Type=SystemString Comment=電話/>

  </Class>

  </SmarkDatamodels>
VsSingleFileGenerator會根據XML生成以下相關實體:
        /// <summary>

  /// 用戶名

  /// </summary>

  public virtual string UserName {

  get {

  return thismUserName;

  }

  set {

  thismUserName = value;

  thisEntityStateFieldChange(UserName);

  }

  }

  

  /// <summary>

  /// 用戶密碼

  /// </summary>

  public virtual string UserPWD {

  get {

  return thismUserPWD;

  }

  set {

  thismUserPWD = value;

  thisEntityStateFieldChange(UserPWD);

  }

  }

  

  /// <summary>

  /// 客戶類型

  /// </summary>

  public virtual int CustomerType {

  get {

  return thismCustomerType;

  }

  set {

  thismCustomerType = value;

  thisEntityStateFieldChange(CustomerType);

  }

  }
VsSingleFileGenerator有個不好的地方就是當主文件修改後會重新生成附屬文件這樣就導致你無法修改代碼文件如果想為某些屬性成員添加Attribute來處理一些功能基本是沒辦法的

  如添加成員數據驗證:

  [NotNull]

  [Length(用戶名長度必須在個字符內!)]

  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:SmarkDataMappingsDataObject

  {

  [ID]

  public string UserName { get{ return mUserName;} set{mUserName=value;EntityStateFieldChange(UserName);} }

  private string mUserName;

  public static SmarkDataFieldInfo userName = new SmarkDataFieldInfo(UserUserName);

  public string BirthDate { get{ return mBirthDate;} set{mBirthDate=value;EntityStateFieldChange(BirthDate);} }

  private string mBirthDate;

  public string Region { get{ return mRegion;} set{mRegion=value;EntityStateFieldChange(Region);} }

  private string mRegion;

  public string Remark { get{ return mRemark;} set{mRemark=value;EntityStateFieldChange(Remark);} }

  private string mRemark;

  }

  }

  這樣的話即使我們如何給屬性添加Attribute都不會帶來代碼上的修改VsSingleFileGenerator只對屬性作一個模板生成其他內容搬過來就可以了:)


From:http://tw.wingwit.com/Article/program/net/201311/12332.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.