.NET:用T4消除代码重复,对了,也错了
背景
我需要为int、long、float等这些数值类型写一些扩展方法,但是我发现他们不是一个继承体系,我的第一个思维就是需要为每个类型重复写一遍扩展方法,这让我觉得非常不爽,但是我还是不情愿的写了,等int和long写完后,我突然觉得我可以让T4帮我写,而且C#支持部分类,就更爽了。
用T4实现
模板(写代码的代码)
<#@ template debug="false" hostspecific="false" language="C#" #>
<#@ assembly name="System.Core" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Text" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ output extension=".cs" #>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO; namespace Happy.Infrastructure.ExtentionMethods
{
public static partial class Check
{
<#
foreach(var type in new string[]{ "double", "int" })
{
#>
/// <summary>
/// 名称为<paramref name="variableName"/>的参数或变量的值(<paramref name="value"/>)必须在某个范围。
/// </summary>
public static void MustBetween(this <#= type #> value, string variableName, <#= type #> start, <#= type #> end)
{
Require(value >= start && value <= end, String.Format(Messages.Error_MustBetween, variableName, start, end));
} /// <summary>
/// 名称为<paramref name="variableName"/>的参数或变量的值(<paramref name="value"/>)必须大于指定的值。
/// </summary>
public static void MustGreaterThan(this <#= type #> value, string variableName, <#= type #> target)
{
Require(value > target, String.Format(Messages.Error_MustGreaterThan, variableName, target));
} /// <summary>
/// 名称为<paramref name="variableName"/>的参数或变量的值(<paramref name="value"/>)必须大于等于指定的值。
/// </summary>
public static void MustGreaterThanEqual(this <#= type #> value, string variableName, <#= type #> target)
{
Require(value > target, String.Format(Messages.Error_MustGreaterThanEqual, variableName, target));
} <#
}
#>
}
}
我对了吗?
当我为这种用法暗自高兴的时候,有位兄弟给了我更好的意见:
看到这段话的那一刻是我当天最开心的时刻,谢谢郭明锋兄弟。
我在反思为啥当时我只思考他们不是一个继承体系,而忽略了他们或许会都实现某个接口呢,意识+经验非常重要,相信这次是一个比较好的经历。
改进后的版本
/// <summary>
/// 名称为<paramref name="variableName"/>的参数或变量的值(<paramref name="value"/>)必须在某个范围。
/// </summary>
public static void MustBetween<T>(this T value, string variableName, T start, T end)
where T : IComparable<T>
{
Require(value.CompareTo(start) >= && value.CompareTo(end) <= , String.Format(Messages.Error_MustBetween, variableName, start, end));
} /// <summary>
/// 名称为<paramref name="variableName"/>的参数或变量的值(<paramref name="value"/>)必须大于指定的值。
/// </summary>
public static void MustGreaterThan<T>(this T value, string variableName, T target)
where T : IComparable<T>
{
Require(value.CompareTo(target) > , String.Format(Messages.Error_MustGreaterThan, variableName, target));
} /// <summary>
/// 名称为<paramref name="variableName"/>的参数或变量的值(<paramref name="value"/>)必须大于等于指定的值。
/// </summary>
public static void MustGreaterThanEqual<T>(this T value, string variableName, T target)
where T : IComparable<T>
{
Require(value.CompareTo(target) >= , String.Format(Messages.Error_MustGreaterThanEqual, variableName, target));
}
备注
再次感谢(郭明锋)http://www.cnblogs.com/guomingfeng/。
.NET:用T4消除代码重复,对了,也错了的更多相关文章
- 用T4消除代码重复,对了,也错了
用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 程序员都非常了解的异常 ...
随机推荐
- go-互斥锁及原子函数
用于解决并发函数的竞争状态问题... package main import ( "fmt" "runtime" "sync" " ...
- 分子量(UVa1586)
题目具体描述见:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=830&a ...
- 【LOJ】#2131. 「NOI2015」寿司晚宴
题解 怎么NOI2015D1--全是一眼秒的sb题--然后我代码全都写跪一遍= = 要是NOI2015是IOI赛制我就可以AK啦(大雾) 代码能力直线下降,NOI2018滚粗预定了啊TAT 我是不是要 ...
- 如何使用Bootstrap4显示和隐藏元素
如何使用Bootstrap4显示和隐藏元素 为了更快地进行移动设备开发,请使用响应式显示类来按设备显示和隐藏元素.避免创建相同站点的完全不同版本,而是相应地为每个屏幕大小隐藏元素. 要隐藏元素,只需使 ...
- ie6 css 返回顶部图标固定在浏览器右下角
比较常用记录一下. #e_float{ _position:absolute; _bottom:auto; _right:50%; _margin-right:-536px; _top:express ...
- 【ASP.NET】编写自己的Web服务器
自己写一个简单的Web服务器,对加深理解Http协议有很好的帮助,下面就看一下一个基于TcpListener的Web服务器: class Program { static void Main(stri ...
- git使用注意点
1. 如果希望在克隆的时候,自己定义要新建的项目目录名称,可以在上面的命令末尾指定新的名字$ git clone git://github.com/schacon/grit.git mygrit 2. ...
- CodeForces 909E Coprocessor
题解. 贪心,拓扑排序. 和拓扑排序一样,先把$flag$为$0$的点能删的都删光,露出来的肯定都是$flag$为$0$的,然后疯狂删$flag$为$0$的,这些会使答案加$1$,反复操作就可以了. ...
- Python导入模块-Import
#1语法importimport module1,module2,module3,module4 #2from xx import xx 语句from module import name1,name ...
- Windows下Wireshark安装版本选择方式
Windows下Wireshark安装版本选择方式 Wireshark版本分为1.X系列和2.X系列.1.X系列是早期版本,不提供中文版本.2.X系列是新版本,安装后,同时提供中文版和英文版.根据 ...