c#

位置:IT落伍者 >> c# >> 浏览文章

根据现有C#代码文件生成扩展代码文件


发布日期:2021年09月26日
 
根据现有C#代码文件生成扩展代码文件

为什么在这里我提出在代码文件的基础上再生相关的代码附属文件呢为什么不直接在原代码文件写完整就可以了;原因很简单因为手写代码是没有电脑来得快最主要一个原因是基于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的支持

强在编译器的支持下保证类型输入规则的有效性以下是本人实现的简单生成模型:

interface IUser

{

[ID]

string UserName { get; set; }

string BirthDate { get; set; }

string Region { get; set; }

string Remark { get; set; }

}

生成的相关代码

[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只对属性作一个模板生成其他内容搬过来就可以了:)

               

上一篇:QTP调用自己开发的.net类库

下一篇:C#实现木马-键盘记录器