[C#] Extension Method

  • 677
  • 0

擴充方法讓您能將方法「加入」至現有型別,而不需要建立新的衍生型別 (Derived Type)、重新編譯,或是修改原始型別。

Extension Method(擴充方法)會定義為靜態方法(static method),
第一個參數會指定方法作業所在的類型,而且會加上 this 修飾詞。

若有一個需求是電話號碼的遮罩,
假設電話號碼為 0987654321,遮罩過後會變成 0987***321
通常會在新增一個 method 來完成這個功能

class Program
{
    static void Main(string[] args)
    {
        string phoneNumber = "0987654321";
        Console.WriteLine(PhoneMask(phoneNumber));    
    }

    private string PhoneMask(string input)
    {
        var number = input.ToCharArray();

        for (var i = 4; i < 7; i++)
        {
            number[i] = '*';
        }
     
        return new string(number);
    }
}

如果 string 這個類別有針對電話號碼遮罩的功能可以使用,
像是:

class Program
{
    static void Main(string[] args)
    {
        string phoneNumber = "0987654321";
        Console.WriteLine(phoneNumber.PhoneMask());    
    }	
}

直接在變數後面加 . 就可以呼叫到需要的方法了,這要如何做到呢?
這時就可以使用擴充方法。

要被擴充的類別必須是擴充方法的第一個參數,並且要加上 this 修飾詞。
PhoneMask 為我想要新增的 string 類別擴充方法,
第一個參數 input 表示呼叫這個 method 的變數,也就是 phoneNumber

public static string PhoneMask(this string input)
{
    var number = input.ToCharArray();

    for (var i = 4; i < 7; i++)
    {
        number[i] = '*';
    }

    return new string(number);
}

如果想要指定遮罩的特殊符號,不僅只是 * 而已,
想要在呼叫擴充方法時依照需求作替換,
這時可以將擴充方法改寫為可以傳入參數的 method:

public static string PhoneMask(this string input, char symbol)
{
    var number = input.ToCharArray();

    for (var i = 4; i < 7; i++)
    {
        number[i] = symbol;
    }

    return new string(number);
}

在使用時就可以傳入參數,例如想要遮罩的特殊符號換成 # ,
畫面就會印出 0987###321:

class Program
{
    static void Main(string[] args)
    {
        string phoneNumber = "0987654321";
        Console.WriteLine(phoneNumber.PhoneMask('#'));    
    }	
}

寫了這個 string 擴充方法後,只要是 string 類別的變數,
都可以使用 PhoneMask 方法。

參考:
https://docs.microsoft.com/zh-tw/dotnet/csharp/programming-guide/classes-and-structs/extension-methods