.NET:用T4消除代码重复,对了,也错了
2013-07-11 08:50
357 查看
背景
我需要为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) >= 0 && value.CompareTo(end) <= 0, 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) > 0, 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) >= 0, String.Format(Messages.Error_MustGreaterThanEqual, variableName, target)); }
备注
再次感谢(郭明锋)http://www.cnblogs.com/guomingfeng/。相关文章推荐
- .NET:用T4消除代码重复,对了,也错了
- .NET:用T4消除代码重复,对了,也错了
- 用T4消除代码重复,对了,也错了
- 使用#include消除重复代码
- 消除重复代码的方法
- 通过继承消除重复代码的简单示例
- 如果消除重复代码?从Timer和TimerTask的封装说起
- 分享.NET开发中经常使用到的代码片段 完全从实际项目中提取出来,也可被反反复复的重复借用
- 使用样式消除重复代码
- Android 勤用RXJava compose操作符消除重复代码
- delphi2009——delphixe2,用匿名函数消除重复代码
- C# 消除重复字符串的代码
- 消除重复代码的意义
- Scala新手指南中文版 -第十篇 Staying DRY with higher-order functions(用高阶函数来消除重复代码)
- C++编译重复代码消除
- 如何消除重复代码
- 一起谈.NET技术,创建代码生成器可以很简单:如何通过T4模板生成代码?[上篇]
- 2.C#中通过委托Func消除重复代码
- awk消除重复代码的方案1
- 一起谈.NET技术,创建代码生成器可以很简单:如何通过T4模板生成代码?[下篇]