擴充方法讓您能將方法「加入」至現有型別,而不需要建立新的衍生型別 (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