C#提供了靜態擴展方法可以在不更改或者沒辦法更改原有組件代碼的情況實現一些定義的擴展方法,擴展方法能夠向現有類型“添加”方法,而無需創建新的派生類型、重新編譯或以其他方式修改原始類型。
擴展方法是一種特殊的靜態方法,但可以像擴展類型上的實例方法一樣進行調用
靜態擴展方法有如下的特征
- 靜態擴展方法位於靜態類中,並且以static修飾符修飾
- 靜態擴展方法的第一個參數以this修飾符為前綴,后跟要擴展的目標類型及參數
- 靜態擴展方法只能針對實例調用,即:靜態類不能作為目標類
- 擴展方法的優先級總是比類型本身中定義的實例方法低,即:如果擴展方法和被擴展類中的某個簽名相同則擴展方法永遠不會被調用
使用
先假設已經存在一個MyMath類,類中實現了IMyMath接口中的Add和Multi方法
namespace ConsoleApp1 { /// <summary> /// 接口 /// </summary> public interface IMyMath { /// <summary> /// 加法 /// </summary> /// <param name="x"></param> /// <param name="y"></param> /// <returns></returns> int Add(int x, int y); /// <summary> /// 乘法 /// </summary> /// <param name="x"></param> /// <param name="y"></param> /// <returns></returns> int Multi(int x, int y); } }
using System; using System.Collections.Generic; using System.Text; namespace ConsoleApp1 { /// <summary> /// Math類,此處作為被擴展函數 /// </summary> public class MyMath : IMyMath { /// <summary> /// 加法 /// </summary> /// <param name="x"></param> /// <param name="y"></param> /// <returns></returns> public int Add(int x, int y) { return x + y; } /// <summary> /// 乘法 /// </summary> /// <param name="x"></param> /// <param name="y"></param> /// <returns></returns> public int Multi(int x, int y) { return x * y; } } }
此處,我需要實現一個新的運算方法,(x + y) * (x + y)運算,此處可以通過靜態擴展方法實現,該靜態擴展類MathExtension針對所有實現了IMyMath接口的類都進行了擴展,如下靜態擴展方法
using System; using System.Collections.Generic; using System.Text; namespace ConsoleApp1 { /// <summary> /// Math靜態擴展類 /// </summary> public static class MathExtension { /// <summary> /// 擴展方法,實現(x + y) * (x + y)運算 /// </summary> /// <param name="math">指定的擴展類的實例,靜態類不能作為目標類</param> /// <param name="x"></param> /// <param name="y"></param> /// <returns></returns> public static int AddMulti(this IMyMath math, int x, int y) { return (x + y) * (x + y); } } }
在入口函數中分別調用MyMath類和MathExtension中的方法,對於AddMulti方法,可以直接通過MyMath實例調用而不需要實例化MathExtensionusing
using System; namespace ConsoleApp1 { internal class Program { private static void Main(string[] args) { IMyMath math = new MyMath(); int result1 = math.Add(4, 5); int result2 = math.Multi(4, 5); int result3 = math.AddMulti(4, 5); Console.WriteLine("result1:" + result1); Console.WriteLine("result2:" + result2); Console.WriteLine("result3:" + result3); Console.ReadLine(); } } }
運行結果如下
微軟官方對於擴展方法的使用也有完整的示例說明,可參照一下鏈接
擴展方法 - C# 編程指南 | Microsoft Docs