用T4消除代码重复,对了,也错了
用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消除代码重复,对了,也错了的更多相关文章
- .NET:用T4消除代码重复,对了,也错了
背景 我需要为int.long.float等这些数值类型写一些扩展方法,但是我发现他们不是一个继承体系,我的第一个思维就是需要为每个类型重复写一遍扩展方法,这让我觉得非常不爽,但是我还是不情愿的写了, ...
- T4:使用 T4 消除程序和配置文件中重复的字符串信息
背景 我们经常在配置文件中配置各种:id.name,然后在程序中使用这些配置获取信息,这导致了字符串重复出现在系统的多个地方,非常不利于维护,本文介绍采用 T4 来消除这种重复. T4 消除重复 配置 ...
- [转]从数据到代码——基于T4的代码生成方式
本文转自:http://www.cnblogs.com/artech/archive/2010/10/23/1859529.html 在之前写一篇文章<从数据到代码>(上篇.下篇)中,我通 ...
- 代码重复检查工具——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 输出类似: ===== ...
- java消除 list重复值及交集,并集,差集
消除 list重复值 Java代码 public void removeDuplicate(List list) { HashSet h = new HashSet(list); list.clea ...
- Scala减少代码重复
高阶函数可以把其它函数当作函数参数,帮助我们减少代码重复,例如: object FileMatcher { private def fileHere = (new File(".\\file ...
- 通过Groovy来消除代码噪声
通过Groovy来消除代码噪声 Java是在JVM上运行的最广泛使用的编程语言.不过,还有很多其他基于JVM的语言,比如Groovy,Scala,JRuby,Jython,Kotlin等等.其中,Gr ...
- 在C#中动态编译T4模板代码
转: http://www.wxzzz.com/1438.html 资料: https://cnsmartcodegenerator.codeplex.com/SourceControl/latest ...
- 使用Java8中的Optional类来消除代码中的null检查
简介 Optional类是Java 8新增的一个类,Optional 类主要解决的问题是臭名昭著的空指针异常(NullPointerException). —— 每个 Java 程序员都非常了解的异常 ...
随机推荐
- 脱O把妹,记录这一周来迁移至MySQL的一些心得
· 背景 公司要把一些老设备退服,一些陪伴我多年的DB要下线了,舍不得.正好借此机会,手贱把自己3个"回收站"DB迁移到MySQL上,也算是赶一把时髦.等真正看着这些老设备下线了的 ...
- Ionic项目中使用极光推送-android
对于Ionic项目中使用消息推送服务,Ionic官方提供了ngCordova项目,这个里面的提供了用angularjs封装好的消息推送服务(官方文档),使用的是GitHub上的 PushPlugin ...
- IOS中 init和initialize
一.init和initialize 1.方法类型 1> init属于对象方法,-开头 2> initialize属于类方法,+开头 2.调用时刻 1> init:每个对象初始化的时候 ...
- Hibernate 之强大的HQL查询
Hibernate 配备了一种非常强大的查询语言,这种语言看上去很像 SQL.但是不要被语法结构上的相似所迷惑,HQL 是非常有意识的被设计为完全面向对象的查询,它可以理解如继承.多态和关联之类 ...
- checkbox
选择功能和反选
使用jQuery实现checkbox全补选和反选功能.什么时候checkbox选择禁用时,不涉及功能 <!DOCTYPE html> <html> <head> & ...
- Python 图论工具
networkx: 一个用Python语言开发的图论与复杂网络建模工具, 内置了经常使用的图与复杂网络分析算法, 能够方便的进行复杂网络数据分析.仿真建模等工作. 依赖工具: numpy pypar ...
- JavaScript中的作用域和声明提前
[翻译]JavaScript中的作用域和声明提前 原文:http://www.adequatelygood.com/JavaScript-Scoping-and-Hoisting.html ===翻译 ...
- :link,:visited,:focus,:hover,:active详解
原文::link,:visited,:focus,:hover,:active详解 CSS 又名 层叠样式表,所谓层叠,就是后面的样式会覆盖前面的样式,所以在样式表中,各样式排列的顺序很有讲究. ...
- Cocos2d-x在Android在竖屏切换
在Cocos2d-x在,屏幕类型的默认设置是横屏,当我们需要切换到肖像,能够在项目目录打开proj.android目录.找到AndroidManifest.xml文件,直接打开,然后就可以看到里面:s ...
- 开源文档管理系统LogicalDOC测试报告---安装篇
开源文档管理系统LogicalDOC测试报告---安装篇 分类: Linux2011-06-22 15:40 7436人阅读 评论(3) 收藏 举报 文档管理测试mysql数据库installerja ...