Extension method giúp bạn tạo thêm các phương thức cho một lớp mà không cần thừa kế lại lớp đó. Với tính năng này, thậm chí khi đối tượng của bạn là null, bạn vẫn có thể thực hiện các extension method của đối tượng đó một cách an toàn.
– Extension method có thể overload.
– Extension method là một loại phương thức tĩnh (static method) đặc biệt được bổ sung vào các lớp đã tồn tại, chúng được gọi như phương thức thể hiện (instance method) thông thường của lớp đó.
– Extension method và instance method: khi trong class đang thao tác có một instance method cùng tên với extension method thì khi gọi: instance method sẽ được thực thi, mức độ ưu tiên cao hơn extension method.
– Các extension method sử dụng một attribute là System.Runtime.CompilerServices.ExtensionAttribute, ExtensionAttribute này có nhiệm vụ chỉ ra một phương thức là một extension method, assembly hay class có chứa extension method. Và sự xuất hiện của attribute này là do từ khóa this mà đặt trước tham số đầu tiên của extension method. Tuy nhiên, bạn không thể sử dụng attribute này thay thế cho từ khóa this, nếu làm như vậy chương trình sẽ báo lỗi.
– Một điểm cơ bản cần lưu ý khi sử dụng extension method: bởi vì chúng không thực sự nằm trong các lớp sẵn có của .NET, nên bạn cần chắc chắn các extension method được khai báo để có thể truy xuất được tại nơi mà bạn gọi nó. Giống như khi bạn sử dụng Linq, thì cần phải using System.Linq;
– Nếu trong trường hợp có extension method TRÙNG TÊN ở 2 namespace khác nhau thì sau khi using tên cả 2 namespace ở nơi bạn muốn gọi, khi muốn gọi extension method của namespace nào thì bạn thêm tên namespace ấy trước extension method muốn gọi theo cú pháp: TênNamespace.TênExtensionMethod().
– Các quy tắc khi định nghĩa và sử dụng extension method:
- Lớp chứa extension method phải là static.
- Extension method cũng phải là một phương thức static.
- Tham số đầu tiên của extension method xác định kiểu của đối tượng sẽ mở rộng được sử dụng với từ khóa this, và tham số đầu tiên này sẽ được bỏ qua khi extension method được gọi.
– Để dễ hình dung, chúng ta sẽ cùng đi vào ví dụ sau:
#1/3:
Trong ví dụ này, đơn giản là chúng ta sẽ mở rộng cho class string có sẵn của .NET 2 method mới:
- Extension method 1: check chuỗi input có phải số hay không.
- Extension method 2: cộng 2 số.
#2/3:
– Sau khi tạo project, chúng ta sẽ tạo một folder trong project có tên là Library, sau đó thêm file StringExtensions.cs để tạo 2 phương thức mở rộng cho class string đã nói ở #1/3:
– Nội dung của file StringExtensions.cs như sau:
namespace MinhHoangBlog.Library { /// <summary> /// Tạo 2 extension method cho lớp string /// </summary> public static class StringExtensions { /// <summary> /// Extension method 1: check chuỗi input có phải số hay không /// </summary> /// <param name="inStr">Chuỗi cần kiểm tra</param> /// <returns>true:Là số、false:không phải số</returns> public static bool IsNumber(this string inStr) { int n = 0; var rtn = int.TryParse(inStr, out n); return rtn; } /// <summary> /// Extension method 2: Cộng 2 số /// </summary> /// <param name="inStr">Chuỗi đại diện</param> /// <param name="inNum1">Số thứ nhất</param> /// <param name="inNum2">Số thứ hai</param> /// <returns>Tổng của 2 số inNum1, inNum2</returns> public static int Add2Numbers(this string inStr, int inNum1, int inNum2) { return inNum1 + inNum2; } } }
#3/3:
Ở nơi gọi extension method Program.cs cần phải khai báo namespace của file chứa extension method, trong ví dụ này sẽ using MinhHoangBlog.Library;
using System; // Thêm thư viện chứa extension method using MinhHoangBlog.Library; namespace MinhHoangBlog { class Program { static void Main(string[] args) { Console.Write("Enter your number: "); string input = Console.ReadLine(); // Gọi extension method 1 bool isNumber = input.IsNumber(); Console.WriteLine("isNumber: {0}", isNumber); // Gọi extension method 2 int sum = input.Add2Numbers(9, 10); Console.WriteLine("Sum: 9 + 10 = {0}", sum); Console.ReadKey(); } } }
Anh ơi phần mà extension method cùng chữ ký nhưng thuộc 2 namespace khác nhau thì cụ thể mình gọi như nào ạ. VD em gọi string s=””; s.A.ExtMethod(); s.B.ExtMethod(); thì không gọi được ạ
Như ở trên a có ghi đó:
(1) Em cần using namespace tại nơi muốn sử dụng method extension của namespace đó
(2) Nếu tên của method extension trong namespace được using ở (1) không trùng tên với method extension trong namespace hiện thì thì em sử dụng như bình thường,
còn tr/h trùng thì em cần chỉ rõ method extension của namespace nào khi gọi sử dụng bằng cách TênNamespace.TênExtensionMethod()