.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 程序员都非常了解的异常 ...
随机推荐
- HBase 入门笔记-安装篇
一.前言 接触HBase已近半年,从一无所知到问题的解决,在数据落地方面也有了一定的了解,在此记录这半年来碰到的一些问题和对一些数据落地方面的见解,本篇主要介绍一下hbase安装方面的信息 二.安装环 ...
- numpy,看不懂,但很利害
慢慢有感觉.. 截几个图看看. import numpy as np np.random.seed(42) complex_numbers = np.random.random(5) + 1j * n ...
- function(函数)中的动态参数
我们可向函数传递动态参数,*args,**kwargs,首先我们来看*args,示例如下: 1.show(*args) def show(*args): print(args,type(arg ...
- python collection系列
collection系列 不常用功能,需要进行模块功能导入: import collection Counter 常用方法测试: #!/usr/local/env python3 ''' Author ...
- C# 使用UDP组播实现局域网桌面共享
最近需要在产品中加入桌面共享的功能,暂时不用实现远程控制:参考了园子里的一些文章,加入了一些自己的修改. 需求:将一台机器的桌面通过网络显示到多个客户端的屏幕上,显示内容可能为PPT,Word文档之类 ...
- 【ASP.NET MVC】Scripts目录
很多时候我们经常在用的东西我们可能不一定真正的了解,因为我们可能已经会用了,便不再对其进行探索,下面我们看一下在ASP.NET MVC3项目下的Scripts目录下的文件: Jquery核心库我们就不 ...
- 【ASP.NET】:Ckeditor+Fckeditor的使用
首先这三个文件:下载ckeditor和ckeditor_aspnet_3.6.4和ckfinder 然后把这三个文件复制到项目根目录下 添加引用CKEditor.NET.dll CKFind ...
- 20169211《Linux内核原理与分析》第二周作业
<linux内核分析>实验一实验报告 <linux内核设计与实现>第1.2.18章学习总结 一.<linux内核分析>实验一实验报告 在进行实验楼操作 ...
- ajax个人总结
ajax是什么? AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML). AJAX 不是新的编程语言,而是一种使用现有标准的新方法. ...
- HTTP状态码,400,404,500,503
HTTP状态码(HTTP Status Code) 一些常见的状态码为: 200 - 服务器成功返回网页 400 服务器不理解请求的语法 404 - 请求的网页不存在 503 - 服务不可用 所有状态 ...