用T4消除代码重复,对了,也错了

背景

我需要为int、long、float等这些数值类型写一些扩展方法,但是我发现他们不是一个继承体系,我的第一个思维就是需要为每个类型重复写一遍扩展方法,这让我觉得非常不爽,但是我还是不情愿的写了,等int和long写完后,我突然觉得我可以让T4帮我写,而且C#支持部分类,就更爽了。

用T4实现

模板(写代码的代码)

 1 <#@ template debug="false" hostspecific="false" language="C#" #>
2 <#@ assembly name="System.Core" #>
3 <#@ import namespace="System.Linq" #>
4 <#@ import namespace="System.Text" #>
5 <#@ import namespace="System.Collections.Generic" #>
6 <#@ output extension=".cs" #>
7 using System;
8 using System.Collections.Generic;
9 using System.Linq;
10 using System.Text;
11 using System.Threading.Tasks;
12 using System.IO;
13
14 namespace Happy.Infrastructure.ExtentionMethods
15 {
16 public static partial class Check
17 {
18 <#
19 foreach(var type in new string[]{ "double", "int" })
20 {
21 #>
22 /// <summary>
23 /// 名称为<paramref name="variableName"/>的参数或变量的值(<paramref name="value"/>)必须在某个范围。
24 /// </summary>
25 public static void MustBetween(this <#= type #> value, string variableName, <#= type #> start, <#= type #> end)
26 {
27 Require(value >= start && value <= end, String.Format(Messages.Error_MustBetween, variableName, start, end));
28 }
29
30 /// <summary>
31 /// 名称为<paramref name="variableName"/>的参数或变量的值(<paramref name="value"/>)必须大于指定的值。
32 /// </summary>
33 public static void MustGreaterThan(this <#= type #> value, string variableName, <#= type #> target)
34 {
35 Require(value > target, String.Format(Messages.Error_MustGreaterThan, variableName, target));
36 }
37
38 /// <summary>
39 /// 名称为<paramref name="variableName"/>的参数或变量的值(<paramref name="value"/>)必须大于等于指定的值。
40 /// </summary>
41 public static void MustGreaterThanEqual(this <#= type #> value, string variableName, <#= type #> target)
42 {
43 Require(value > target, String.Format(Messages.Error_MustGreaterThanEqual, variableName, target));
44 }
45
46 <#
47 }
48 #>
49 }
50 }

我对了吗?

当我为这种用法暗自高兴的时候,有位兄弟给了我更好的意见:

看到这段话的那一刻是我当天最开心的时刻,谢谢郭明锋兄弟。

我在反思为啥当时我只思考他们不是一个继承体系,而忽略了他们或许会都实现某个接口呢,意识+经验非常重要,相信这次是一个比较好的经历。

改进后的版本

 1         /// <summary>
2 /// 名称为<paramref name="variableName"/>的参数或变量的值(<paramref name="value"/>)必须在某个范围。
3 /// </summary>
4 public static void MustBetween<T>(this T value, string variableName, T start, T end)
5 where T : IComparable<T>
6 {
7 Require(value.CompareTo(start) >= 0 && value.CompareTo(end) <= 0, String.Format(Messages.Error_MustBetween, variableName, start, end));
8 }
9
10 /// <summary>
11 /// 名称为<paramref name="variableName"/>的参数或变量的值(<paramref name="value"/>)必须大于指定的值。
12 /// </summary>
13 public static void MustGreaterThan<T>(this T value, string variableName, T target)
14 where T : IComparable<T>
15 {
16 Require(value.CompareTo(target) > 0, String.Format(Messages.Error_MustGreaterThan, variableName, target));
17 }
18
19 /// <summary>
20 /// 名称为<paramref name="variableName"/>的参数或变量的值(<paramref name="value"/>)必须大于等于指定的值。
21 /// </summary>
22 public static void MustGreaterThanEqual<T>(this T value, string variableName, T target)
23 where T : IComparable<T>
24 {
25 Require(value.CompareTo(target) >= 0, String.Format(Messages.Error_MustGreaterThanEqual, variableName, target));
26 }

备注

再次感谢(郭明锋)http://www.cnblogs.com/guomingfeng/

用T4消除代码重复,对了,也错了的更多相关文章

  1. .NET:用T4消除代码重复,对了,也错了

    背景 我需要为int.long.float等这些数值类型写一些扩展方法,但是我发现他们不是一个继承体系,我的第一个思维就是需要为每个类型重复写一遍扩展方法,这让我觉得非常不爽,但是我还是不情愿的写了, ...

  2. T4:使用 T4 消除程序和配置文件中重复的字符串信息

    背景 我们经常在配置文件中配置各种:id.name,然后在程序中使用这些配置获取信息,这导致了字符串重复出现在系统的多个地方,非常不利于维护,本文介绍采用 T4 来消除这种重复. T4 消除重复 配置 ...

  3. [转]从数据到代码——基于T4的代码生成方式

    本文转自:http://www.cnblogs.com/artech/archive/2010/10/23/1859529.html 在之前写一篇文章<从数据到代码>(上篇.下篇)中,我通 ...

  4. 代码重复检查工具——python的使用CPD比较好用,clone digger针对py2,其他有名的如Simian PMD-CPD CloneDR CCCD CCFinder Bauhaus CodePro

    代码重复检测: cpd --minimum-tokens 100 --files g:\source\python\ --language python >log.txt 输出类似: ===== ...

  5. java消除 list重复值及交集,并集,差集

    消除 list重复值 Java代码  public void removeDuplicate(List list) { HashSet h = new HashSet(list); list.clea ...

  6. Scala减少代码重复

    高阶函数可以把其它函数当作函数参数,帮助我们减少代码重复,例如: object FileMatcher { private def fileHere = (new File(".\\file ...

  7. 通过Groovy来消除代码噪声

    通过Groovy来消除代码噪声 Java是在JVM上运行的最广泛使用的编程语言.不过,还有很多其他基于JVM的语言,比如Groovy,Scala,JRuby,Jython,Kotlin等等.其中,Gr ...

  8. 在C#中动态编译T4模板代码

    转: http://www.wxzzz.com/1438.html 资料: https://cnsmartcodegenerator.codeplex.com/SourceControl/latest ...

  9. 使用Java8中的Optional类来消除代码中的null检查

    简介 Optional类是Java 8新增的一个类,Optional 类主要解决的问题是臭名昭著的空指针异常(NullPointerException). —— 每个 Java 程序员都非常了解的异常 ...

随机推荐

  1. Ionic项目中使用极光推送

    Ionic项目中使用极光推送-android   对于Ionic项目中使用消息推送服务,Ionic官方提供了ngCordova项目,这个里面的提供了用angularjs封装好的消息推送服务(官方文档) ...

  2. Quartz使用-入门使用(java定时任务实现)

    注:这里使用的是Quartz1.6.5版本号(包:quartz-1.6.5.jar) //測试main函数 //QuartzTest.java package quartzPackage; impor ...

  3. Ronco创投原则 - 硅谷创业教父Paul Graham文摘

    (天地会珠海分舵注:虽然已经尽力翻译,还是担心会和大师的原意有偏差,所以这里保留英文原文给大家作参考) Ronco创投原则 No one, VC or angel, has invested in m ...

  4. JS子元素oumouseover触发父元素onmouseout

    原文:JS子元素oumouseover触发父元素onmouseout JavaScript中,父元素包含子元素: 当父级设置onmouseover及onmouseout时,鼠标从父级移入子级,则触发父 ...

  5. 使用SQL Server Driver for PHP解决PHP连接MSSQL乱码的问题

    原文 使用SQL Server Driver for PHP解决PHP连接MSSQL乱码的问题 最近帮客户写了一个.net商城网站的发布接口,大家都知道.net一般都使用MSSQL数据库,但鱼丸不会. ...

  6. ExtJS4 便捷三层开发模式

    ExtJS4 便捷三层开发模式 定义类已经不是ext4.x一个新特性,但与ext3.x的自定义类有语法上的区别.将相关模块封装成类可以有效的减少浏览器的压力,提高渲染速度,同时抽象每一个可重用方法,减 ...

  7. C#中调用Outlook API 发起会议

    原文:C#中调用Outlook API 发起会议 在我上一篇博文中曾提到了 SharePoint 中调用传出电子邮件中的邮件服务器及地址发送邮件 但是,里面的方法只能用于发送普通电子邮件.如果要发起会 ...

  8. leetcode第33题--Search for a Range

    Given a sorted array of integers, find the starting and ending position of a given target value. You ...

  9. Asp.Net Identity 深度解析 之 注册登录的扩展

    关于权限每个系统都有自己的解决方案,今天我们来讨论一下微软的权限框架Asp.Net Identity ,介绍如下  http://www.asp.net/identity 这里不在赘余. 很多人认为 ...

  10. js 计算过去和未来的时间距离现在多少天?

    计算传入的任意一时间.计算出这个时间距离现在还有多少天!或者计算过去的时间距离现在已经过去了多少天! 返回值有两种! 1.负值 代表过去了多少天 2.正值 代表距离设定的时间还有多少天 说明:距离设定 ...