博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
.NET:用T4消除代码重复,对了,也错了
阅读量:6464 次
发布时间:2019-06-23

本文共 3176 字,大约阅读时间需要 10 分钟。

背景

我需要为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.ExtentionMethods15 {16     public static partial class Check17     {18 <#19 foreach(var type in new string[]{ "double", "int" })20 {21 #>22         /// 23         /// 名称为
的参数或变量的值(
)必须在某个范围。24 ///
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 /// 31 /// 名称为
的参数或变量的值(
)必须大于指定的值。32 ///
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 /// 39 /// 名称为
的参数或变量的值(
)必须大于等于指定的值。40 ///
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         ///  2         /// 名称为
的参数或变量的值(
)必须在某个范围。 3 ///
4 public static void MustBetween
(this T value, string variableName, T start, T end) 5 where T : IComparable
6 { 7 Require(value.CompareTo(start) >= 0 && value.CompareTo(end) <= 0, String.Format(Messages.Error_MustBetween, variableName, start, end)); 8 } 9 10 ///
11 /// 名称为
的参数或变量的值(
)必须大于指定的值。12 ///
13 public static void MustGreaterThan
(this T value, string variableName, T target) 14 where T : IComparable
15 {16 Require(value.CompareTo(target) > 0, String.Format(Messages.Error_MustGreaterThan, variableName, target));17 }18 19 ///
20 /// 名称为
的参数或变量的值(
)必须大于等于指定的值。21 ///
22 public static void MustGreaterThanEqual
(this T value, string variableName, T target)23 where T : IComparable
24 {25 Require(value.CompareTo(target) >= 0, String.Format(Messages.Error_MustGreaterThanEqual, variableName, target));26 }

备注

再次感谢(郭明锋)。

 

转载地址:http://kzhzo.baihongyu.com/

你可能感兴趣的文章
lua序列化(支持循环引用)
查看>>
【转载】Java - Wait & Notify
查看>>
通过回调在fragment中获取activity的触摸事件
查看>>
安卓 内容提供者 sql 区别
查看>>
CSRF
查看>>
B-tree&B+tree
查看>>
jquery禁止点击事件,css禁止按钮
查看>>
C#Windows Form简易计算器实现(上)
查看>>
使用Matplotlab画图
查看>>
瑞星:周末拦截挂马网站数减少 新闻类网站占主打
查看>>
REST服务开发实战,互联网营销
查看>>
一起谈.NET技术,验证.NET强命称的思路和实例
查看>>
java springcloud版b2b2c社交电商spring cloud分布式微服务(十八)定时任务(Scheduling Tasks)...
查看>>
基于headless chrome的游戏资源下载实现 (初版)
查看>>
引用传递函数值
查看>>
第一周:JavaEE——课程目标
查看>>
ICP(迭代最近点)算法
查看>>
python 基础 切片 迭代 列表生成式
查看>>
编写脚本,开始场景有两个球体,两者之间距离为10,当距离大于10时,两个球相向运动,两个球接触后反向运动,反复运动...
查看>>
django 快速实现session的操作
查看>>