WEB开发网
开发学院软件开发C语言 详解C#代码文件生成扩展代码文件 阅读

详解C#代码文件生成扩展代码文件

 2009-04-04 08:24:26 来源:WEB开发网   
核心提示: VsSingleFileGenerator有个不好的地方就是当主文件修改后会重新生成附属文件,这样就导致你无法修改代码文件.如果想为某些属性成员添加Attribute来处理一些功能基本是没办法的.如添加成员数据验证:[NotNull][Length("5","

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 2 

Tags:详解 代码 文件

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接