.NET:用T4消除代码重复,对了,也错了

来源:互联网 发布:唇釉和口红的区别知乎 编辑:程序博客网 时间:2024/04/30 04:52

背景

我需要为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         /// <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/。

 


<script type="text/javascript"><!--google_ad_client = "ca-pub-1944176156128447";/* cnblogs 首页横幅 */google_ad_slot = "5419468456";google_ad_width = 728;google_ad_height = 90;//--></script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
原创粉丝点击