本文着重讲解用C#代码文件生成扩展代码文件,并且详细讲了在数据持久层里是采用XML结合IVsSingleFileGenerator来生成相关实体类的方法。

看到这标题的朋友或许搞不懂到底在搞什么,不过没关系有爱好的朋友能够先了解一下IVsSingleFileGenerator到底是用来做什么用的《完成自定义的VsSingleFileGenerator 》;在vs.net里供给一个IVsSingleFileGenerator接口能够方便地为项目文件生成隶属文件,如方才那文章说到的依据XML文件主动生成一个隶属的C#代码文件;当然这个IVsSingleFileGenerator并不仅仅针对XML文件,能够是随意为任何项目文件生成隶属文件你只要在文件特点中设置相关Custom Tools就能够了.

详解C#代码文件生成扩展代码文件(c#代码源文件的扩展名)  C# XML 扩展代码 第1张

为什么在这里我提出在代码文件的基础上再生相关的代码隶属文件呢,为什么不直接在原代码文件写完好就能够了;原因很简略由于手写代码是没有电脑来得快,最主要一个原因是依据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生成以下相关实体:
/// <summary>
/// 用户名
/// </summary>
public virtual string UserName {
get {
return this.mUserName;
}
set {
this.mUserName = value;
this.EntityState.FieldChange("UserName");
}
}
/// <summary>
/// 用户暗码
/// </summary>
public virtual string UserPWD {
get {
return this.mUserPWD;
}
set {
this.mUserPWD = value;
this.EntityState.FieldChange("UserPWD");
}
}
/// <summary>
/// 客户类型
/// </summary>
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只对特点作一个模板生成其他内容搬过来就能够了:)

WPS的排版真是没有WORD的好...估量我不会用.

【修改引荐】

  1. C#在WinForm开发中Label换行办法
  2. C#中运用多线程拜访Winform问题处理方案
  3. 怎么运用C#代码完成DataTemplate
转载请说明出处
知优网 » 详解C#代码文件生成扩展代码文件(c#代码源文件的扩展名)

发表评论

您需要后才能发表评论