C# Meta Programming - Let Your Code Generate Code - Introduction of The Text Template Transformation Toolkit(T4)

<#@ template language="C#" #>
<#@ output extension=".cs" #>
<#@ assembly name="System.Core" #>
<#@ import namespace="System.Linq" #>
<#
  Type[] types_to_generate = new[]
  {
    typeof(object),  typeof(bool),    typeof(byte),
    typeof(char),    typeof(decimal), typeof(double),
    typeof(float),   typeof(int),     typeof(long),
    typeof(sbyte),   typeof(short),   typeof(string),
    typeof(uint),    typeof(ulong),   typeof(ushort)
  };
#>
using System;
public static class GreaterTest
{
<#
  foreach (var type in types_to_generate)
  {
#>
  public static <#= type.Name #> of(<#= type.Name #> left, <#= type.Name #> right)
  {
<#
    Type icomparable =
      (from intf in type.GetInterfaces() where
        typeof(IComparable<>)
          .MakeGenericType(type).IsAssignableFrom(intf)
        ||
        typeof(IComparable).IsAssignableFrom(intf)
      select intf).FirstOrDefault();
    if (icomparable != null)
    {
#>
    return left.CompareTo(right) < 0 ? right : left;
<#
    }
    else
    {
#>
    throw new ApplicationException(
      "Type <#= type.Name #> must implement one of the " +
      "IComparable or IComparable<<#= type.Name #>> interfaces.");
<#
    }
#>
  }
<#
  }
#>
}

 

生成的代码:

using System;
public static class GreaterTest
{
  public static Object of(Object left, Object right)
  {
    throw new ApplicationException(
      "Type Object must implement one of the " +
      "IComparable or IComparable<Object> interfaces.");
  }
  public static Boolean of(Boolean left, Boolean right)
  {
    return left.CompareTo(right) < 0 ? right : left;
  }
  public static Byte of(Byte left, Byte right)
  {
    return left.CompareTo(right) < 0 ? right : left;
  }
  public static Char of(Char left, Char right)
  {
    return left.CompareTo(right) < 0 ? right : left;
  }
  public static Decimal of(Decimal left, Decimal right)
  {
    return left.CompareTo(right) < 0 ? right : left;
  }
  public static Double of(Double left, Double right)
  {
    return left.CompareTo(right) < 0 ? right : left;
  }
  public static Single of(Single left, Single right)
  {
    return left.CompareTo(right) < 0 ? right : left;
  }
  public static Int32 of(Int32 left, Int32 right)
  {
    return left.CompareTo(right) < 0 ? right : left;
  }
  public static Int64 of(Int64 left, Int64 right)
  {
    return left.CompareTo(right) < 0 ? right : left;
  }
  public static SByte of(SByte left, SByte right)
  {
    return left.CompareTo(right) < 0 ? right : left;
  }
  public static Int16 of(Int16 left, Int16 right)
  {
    return left.CompareTo(right) < 0 ? right : left;
  }
  public static String of(String left, String right)
  {
    return left.CompareTo(right) < 0 ? right : left;
  }
  public static UInt32 of(UInt32 left, UInt32 right)
  {
    return left.CompareTo(right) < 0 ? right : left;
  }
  public static UInt64 of(UInt64 left, UInt64 right)
  {
    return left.CompareTo(right) < 0 ? right : left;
  }
  public static UInt16 of(UInt16 left, UInt16 right)
  {
    return left.CompareTo(right) < 0 ? right : left;
  }
}

 

时间: 2024-09-27 01:15:42

C# Meta Programming - Let Your Code Generate Code - Introduction of The Text Template Transformation Toolkit(T4)的相关文章

Meta Programming System 2.0发布 专业软件开发环境

Meta Programming System 2.0经过几个里程碑,期待已久的第二个版本的MPS现在终于提供给公众啦! 2.0的主要亮点是: ·支持建立独立的语言定制IDE·改善类型系统,加上跟踪类型的计算能力·脚本和自定义构建过程·重新设计的用户界面合并不同版本,更安全和直观·从Java的智能粘贴代码·数据流分析仪语言等等 下载地址: Windows: http://download.jetbrains.com/mps/MPS-2.0.exeMac OS X: http://download

Custom tool error: Failed to generate code for the service reference &amp;#215;&amp;#215;&amp;#215;&amp;#215;&amp;#215;&amp;#215;. Please check other erro

开发工具:VS2010 问题描述: 在ProjectName.Web中创建的WebService服务,然后在项目中添加Add Service Reference,然后就报"Custom tool error: Failed togenerate code for the service reference ××××××. Please check other error andwarning messages for details. "这样的错误  新建.调用WebService 解

090723 T Code Generate 的思考

今天看了公司(易车)原来团队开发的部分项目的代码,发现很多项目是基于Typed DataSet或NetTiers的,两者都是代码生成器(Code Generator,以下简称CG),前者是VS自带的工具,而后者则是第三方开发,同样的还有CodeSmith.动软等.这些CG的输入/信息来源,大都是数据库中的元数据. 其实,我个人也开发过CG.第一个是在上海外高桥实习时用于转换C语言到C#语言的转换器.另一个则是配合hxy.LayersFramework框架的生成器,其输入主要来自于LINQTOSQ

Infrastractor As Code中Code与物理资源同步的原理分析

上篇文章讲到<企业应用如何解决Multi-Cloud的基础设施管理及应用部署问题>,其核心是使用Terraform的模板管理基础设施,虽然Terraform的中文资料较少,好在阿里云Terraform官方仓库的Example目录中提供了大量的模板参考,参考这些模板将能够管理常用的云服务. 什么是Infrastractor As Code(IaC) 基础设施即代码(IaC)的概念已经被人们所熟知,其核心就是"告别手工配置基础设施的时代,用自定义脚本来配置基础设施".目前也有很

[转]T4 Code Generation

[原文:http://www.hanselman.com/blog/T4TextTemplateTransformationToolkitCodeGenerationBestKeptVisualStudioSecret.aspx]Rob beat me to it. Blogging about T4 (the Text Template Transformation Toolkit) had been on my list literally for a year. He and I were

代码生成技术--CodeDom VS T4

     在微软的自家代码生成方案中我们有两种选择方式:CodeDom 和Text Template Transformation Toolkit(T4)模板.同样我们可以利用简单的String或者StringBuilder来拼接字符串,但是那对于简单的还可以,但是对于复杂的问题就.其实在ASP.NET MVC 3.0中有多处了一个更简洁语法的模板-Razor,我们同样可以运用于我们自己的代码生成中,我随便有一篇简单的介绍Razor Templating Engine,在以后有机会了会写Razo

AspNet MVC与T4,我定制的视图模板

原文http://www.cnblogs.com/hbq-fczzw/archive/2011/11/11/2191614.html 一. 遇到的问题 文章开头部分想先说一下自己的困惑,在用AspNet MVC时,完成Action的编写,然后添加一个视图,这个时候弹出一个添加视图的选项窗口,如下: 很熟悉吧,继续上面说的,我添加一个视图,强类型的.继承母版页的视图,点击确定,mvc会为我们添加一些自动生成的代码,感觉很方便.呵呵,刚开始的时候还真方便一些,但也仅仅只是方便一些而已.当遇到以下情景

Asp.net mvc 2 in action 笔记- 4 自动代码生成、校验Validation

自动代码生成 T4 (Text Template Transformation Toolkit) is a little-known feature of Visual Studio. It's a code-generation toolkit, and its templates allow us to customize how files are generated using a familiar syntax. T4MVC Out of the box, ASP.NET MVC co

如何利用T4 模板提升ASP.NET MVC开发速度

最近由于需要在框架中提供一些自定义模板的功能,找到了一篇博客,可惜似乎是翻译工具直接翻的,读不通顺,就试着自己翻译下,我不会完全翻译原文的句子,可能会对原文进行小范围的我认为更合适的句子并添加些注释,,原文地址如下: http://blogs.msdn.com/b/webdev/archive/2009/01/29/t4-templates-a-quick-start-guide-for-asp-net-mvc-developers.aspx 在我们最近的博客中提到的ASP.NET MVC Re