程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> .NET中使用T4消除代碼重復

.NET中使用T4消除代碼重復

編輯:關於.NET

背景

我需要為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));
        }
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved