永利最大(官方)网站

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

转帖|其它|编辑:郝浩|2009-04-03 10:04:29.000|阅读 619 次

概述:在vs.net里提供一个IVsSingleFileGenerator接口可以方便地为项目文件生成附属文件,如刚才那文章提到的根据XML文件自动生成一个附属的C#代码文件

#慧都22周年庆大促·界面/图表报表/文档/IDE/IOT/测试等千款热门软控件火热促销中>>

看到这标题的朋友可能搞不懂到底在搞什么,不过不要紧有兴趣的朋友可以先了解一下IVsSingleFileGenerator到底是用来做什么用的;在vs.net里提供一个IVsSingleFileGenerator接口可以方便地为项目文件生成附属文件,如刚才那文章提到的根据XML文件自动生成一个附属的C#代码文件;当然这个IVsSingleFileGenerator并不只是针对XML文件,可以是随便为任何项目文件生成附属文件你只要在文件属性中设置相关Custom Tools就可以了.


      为什么在这里我提出在代码文件的基础上再生相关的代码附属文件呢,为什么不直接在原代码文件写完整就可以了;原因很简单因为手写代码是没有电脑来得快,最主要一个原因是基于XML的IVsSingleFileGenerator在某方面不好所以才采用基于代码文件的方式作为代码描述模板.用XML描述在现情况碰到的问题,在我的数据持久层里是采用XML结合IVsSingleFileGenerator来生成相关实体类的.

内容大概如下:
<SmarkDatamodels xmlns="//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 {

 &nbsp;     &nbsp;        return this.mUserName;

            }

          &nbsp; set {

           &nbsp; ;   this.mUserName = value;

       &nbsp;        this.EntityState.FieldChange("UserName");

&nbsp;  &nbsp;        }

        }

        

        /// <summary>

        /// 用户密码

        /// </summary>

        public virtual string UserPWD {

       &nbsp;    ;get {

     &nbsp;          return this.mUserPWD;

      &nbsp;     }

   &nbsp;        set {

      ;         &nbsp;this.mUserPWD = value;

 &nbsp;              this.EntityState.FieldChange("UserPWD");

          ;  }

        }

        

        /// <summary>

        /// 客户类型

        /// </summary>

        public virtual int CustomerType {

  &nbsp;         get {

              &nbsp; return this.mCustomerType;

          &nbsp; }

            set {

         &nbsp;     &nbsp;this.mCustomerType = value;

              &nbsp; this.EntityState.FieldChange("CustomerType");

       &nbsp;    }

     }
VsSingleFileGenerator有个不好的地方就是当主文件修改后会重新生成附属文件,这样就导致你无法修改代码文件.如果想为某些属性成员添加Attribute来处理一些功能基本是没办法的.

如添加成员数据验证:

        [NotNull]

        [Length("5","16","用户名长度必须在5-16个字符内!")]

        public string UserName

        {

 ;           get;

         &nbsp;  set;

        }

即使能解决VsSingleFileGenerator生成附属文件冲突问题;但也要面对另一个问题,就如何扩展XML来处理这些扩展呢,添加XMLSchema扩展描述规则,重写VsSingleFileGenerator代码生成部份;这样下来没多久我估计自己会疯了....

实际情况添加不同Attribute来扩展辅助功能是很常见的事情,就一个验证来说根据实际情况就有很多情况,类构造方式也不一样.就针对这些情况来扩展XMLSchema和重写VsSingleFileGenerator带来的工作量就不用说了,还有一个问题就是XML并不能提供类型编译的保证这样对XML的质量是很难保证.

 

经过了一段时间的思考发现为什么不直接用代码作为原模板呢,这样就能得到IDE的支持,强在编译器的支持下保证类型输入规则的有效性.以下是本人实现的简单生成模型:

    [Table]

    interface IUser

    {

        [ID]

        string UserName { getset; }

        string BirthDate { getset; } 

        string Region { getset; }

        string Remark { getset; }

    }

生成的相关代码

    [Table]

      [Serializable]

    public class User:Smark.Data.Mappings.DataObject

    {

        [ID]

        public string UserName { getreturn 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 { getreturn mBirthDate;} set{mBirthDate=value;EntityState.FieldChange("BirthDate");} } 

private string mBirthDate;

        public string Region { getreturn mRegion;} set{mRegion=value;EntityState.FieldChange("Region");} }

private string mRegion;

        public string Remark { getreturn mRemark;} set{mRemark=value;EntityState.FieldChange("Remark");} }

private string mRemark;

    }

}

这样的话即使我们如何给属性添加Attribute都不会带来代码上的修改,VsSingleFileGenerator只对属性作一个模板生成其他内容搬过来就可以了:)


标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@hmdbvip.cn

文章转载自:博客园

为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP
PM娱乐城网络现金网站(官方)网站/网页版登录入口/手机版登录入口-最新版(已更新) PM娱乐城最大(官方)网站/网页版登录入口/手机版登录入口-最新版(已更新) 永利外围最新(官方)网站/网页版登录入口/手机版登录入口-最新版(已更新) 网络权威朗驰娱乐大全(官方)网站/网页版登录入口/手机版登录入口-最新版(已更新) 永利真人网上足球(官方)网站/网页版登录入口/手机版登录入口-最新版(已更新) 利记最火十大网(官方)网站/网页版登录入口/手机版登录入口-最新版(已更新) boyu·博鱼权威网络足球(官方)网站/网页版登录入口/手机版登录入口-最新版(已更新) PM娱乐城网上足球(官方)网站/网页版登录入口/手机版登录入口-最新版(已更新)