• 用T4消除代码重复,对了,也错了


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

    背景

    我需要为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.ExtentionMethods
    15 {
    16     public static partial class Check
    17     {
    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/

  • 相关阅读:
    JavaScript调试
    HTML5 Content Editable实践
    微信中a链接无法进行跳转
    javascript数据类型理解整理
    做个实用的选择器,从此远离满世界找插件
    Ajax中get和post使用问题
    JSON.stringify()、JSON.parse()和eval(string)
    PHP插入header('content-type:text/html;charset="utf-8')和error_reporting()
    Ajax关于readyState(状态值)和status(状态码)的研究
    堆排序中的上滤和下滤
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3183637.html
Copyright © 2020-2023  润新知