技术开发 频道

告别重复!巧用Visual Studio代码生成器

  【IT168 技术】Visual Studio 2010中,内置了一个叫Text Template Transformation Toolkit的代码生成器,这会大大方便开发者的开发代码的速度。本文将讲解如何在Visual Studio 2010中使用Text Template Transformation Toolkit生成代码,读者在学习了本文后,应该可以触类旁通,在编程中充分运用Text Template Transformation Toolkit去提高编码效率。

  介绍及准备工作

  曾几何时,作为程序员的你,经常都面对这样的情景:要创建一个类,类中的属性对应数据库中表的各列,还有经常书写象增删改查等重复代码。在Visual Studio 2010中,已经内置了一个免费的代码生成工具Text Template Transformation Toolkit(简称T4),可以在你设置好代码生成模版后,自动生成相关的代码。

  本文以C#为例,演示了如何创建一个由T4模版生成的类,这个类中包含了数据库中相关表的每一个属性,本文的代码可以在这里下载(http://authors.aspalliance.com/vvarallo/CodeGeneratorT4.zip)。同时,开发者必须先下载和安装样例数据库文件AdventureWorks。接者再创建一个登陆SQL SERVER的用户名和密码,我们在这里都将两者设置为aspalliacne。下面我们开始学习一步步实现使用T4生成代码。

  步骤1 创建代码生成器工程

  1)启动visual studio 2010。

  2)选择新建工程项目,在工程模版列表中,选择Class Library类库,将工程项目名命名为CodeGeneratorT4,点完成按钮。

  3)在刚建立的项目中,我们删除系统默认建立的class1.cs文件。

  步骤2 创建用于生成类文件的文本模版

  1)鼠标右键项目,在弹出的菜单中,选择新增项目,其中选择Text Template,并将其命名为BusinesObject.tt,如下图:

  2)打开这个BusinessObject.tt文件,其中会收到Visual Studio的警告,这个可以点继续按钮忽略之。

  3)在这个文件中,会发现有两行文件

<#@ template debug="false" hostspecific="false" language="C#" #>
<#@ output extension=".txt" #>

  其中,以<#@为标记的我们称之为指令,它们指定了如何生成相关的代码,完整的指令可以在http://msdn.microsoft.com/en-us/library/bb126421.aspx中找到,其中的debug属性指定了是否允许调试模版,language属性指定了使用的编程语言为c#,当然你也可以指定为VB.NET。参数extension指定了由模版生成的文件的后缀,这里我们因为要生成C#文件,所以这里修改为“.cs”。

  4)在这个例子中,我们要读取数据库,所以我们需要引入相关的类库,继续修改代码如下:

<#@ assembly name="System.Data" #>
<#@ assembly name="System.XML" #>
<#@ import namespace="System.Data" #>
<#@ import namespace="System.Data.SqlClient" #>

  5)接下来,我们就可以编写代码,读取数据库中的数据,其中注意我们要把这些代码编写在#号之间的区域,形成代码块。

  <#
  
string tableName ="Person.Address";
  
string className = "Address";
  SqlConnection cn
= new SqlConnection("Data Source=(local);User
  ID=aspalliance;Password=aspalliance;Initial Catalog=AdventureWorks;");
  cn.Open();
  SqlCommand cmd
= new SqlCommand("SELECT * FROM " + tableName, cn);
  DataTable dt
= cmd.ExecuteReader(CommandBehavior.CloseConnection).GetSchemaTable();
  #
>

  在这段代码中,指定了要映射的表名为Person.Address,被映射的类为Address,接下来的几行代码是很简单的从数据库中读取代码,这里就不过多解析。要注意的是,目前在T4中,还没办法做到拼写的智能感知纠错,所以要注意拼写。当编写完以上代码保存后,T4会自动产生相应的代码文件,而不需要再按F5来运行整个工程。

  6)接下来,我们要在模版文件中编写如下代码:

using System;
using System.Data.SqlClient;
using System.Data;

  要注意的是,这里我们并没有象之前那样,使用模版符号#,这是因为,在我们生成的类文件中,是本身要调用相关的类库的。

  7)当我们每次保存T4的模版文件时,会发现在资源管理器中,都会生成对应的CS文件,如下图:

  8) 接下来,我们要根据数据库中的表名,生成对应的类名,编写代码如下:

  public class <#= className #>

  这里,使用了<#= #>的模版指示符号,其中的className,刚好是之前我们自定义的变量,其值为Address,因此,该行模版生成的真实代码文件如下图所示:

  9) 接下来,我们编写如下的代码,使用循环读出每一个数据表中的列,并为其生成类中的对应属性,代码如下:

{
<#
foreach(DataRow dr in dt.Rows)
{
Write(
" public " + dr["ColumnName"] + " { get; set; }" +
Environment.NewLine);
}
#
>
}

  以上这段模版,生成的实际代码效果如下:

  using System;
  
using System.Data.SqlClient;
  
using System.Data;
  
public class Address
  {
  
public AddressID { get; set; }
  
public AddressLine1 { get; set; }
  
public AddressLine2 { get; set; }
  
public City { get; set; }
  
public StateProvinceID { get; set; }
  
public PostalCode { get; set; }
  
public rowguid { get; set; }
  
public ModifiedDate { get; set; }
  }

  注意到什么了吗?生成的每个属性中,没有指定数据的类型,下面我们改进下,代码如下:

  <#+
  
private string GetCSharpType(DataRow dr)
  {
  
bool isNullable = Convert.ToBoolean(dr["AllowDBNull"]);
  
switch (dr["DataType"].ToString())
  {
  
case "System.Int16":
  
if (isNullable)
  
return"Nullable";
  
else
  
return"short";
  
case "System.Int32":
  
if (isNullable)
  
return"Nullable";
  
else
  
return "int";
  
case "System.String":
  
return "string";
  
case "System.DateTime":
  
return "DateTime";
  
case "System.Byte":
  
if (isNullable)
  
return "Nullable";
  
else
  
return "byte";
  
case "System.Byte[]":
  
return "Binary";
  
case "System.Boolean":
  
return "bool";
  
case "System.Decimal":
  
return "double";
  
case "System.Guid":
  
return "Guid";
  
default:
  
throw new Exception("Type not known");
  }
  }
  #
>

  这里,请注意我们另外编写了一个函数方法GetCSharpType,传入的参数是数据库表中的每一列,然后在代码中,根据每个数据表列的类型进行转换为C#中的语言类型。在T4模版中,注意我们使用“<#+ …#>”,在其中可以写相关的模版转换函数。

  最后,修改下调用模版函数的一句代码如下:

Write(" public " + GetCSharpType(dr) + " " + dr["ColumnName"] + " { get; set; }" + Environment.NewLine);

  以上实际生成的代码如下图:

  小 结:

  Visual Studio 2010中的T4代码模版生成器,功能是十分强大的,开发者可以结合已有的常用代码,使用T4进行编写模版,就可以很快地生成相关开发语言(C#,VB.NET)的代码,大大减轻了重复劳动,开始学习T4的编写方法可能会有点麻烦,但当开发者熟练后,就会发现T4的确大大增强了开发效率,更多的关于T4代码生成器的文档,请参考微软的相关文档。

0
相关文章