Các phương thức mở rộng là các phương thức thêm vào lớp, cấu trúc, giao diện có sẵn mà không cần thiết phải kế thừa lớp để tạo ra các lớp mới, không cần biên dịch lại thư viện. Các phương thức mở rộng khai báo là những phương thức tĩnh, nhưng lại được gọi thông qua đối tượng lớp mà phương thức mở rộng đó khai báo.
Kỹ thuật dùng hàm mở rộng để bổ sung các tính năng cho thư viện sẵn có được dùng rất nhiều trong thư viện LINQ - để mở rộng chức năng cho các IEnumerable
Xem ví dụ sau:
using System.Collections.Generic; namespace CS020_ExtensionMethod { class Program { static void Main(string[] args) { List<int> ls = new List<int>() {1,2,3,4}; var ps = ls.Where(i => i >= 3); // Lỗi vì List không có phương thức Where } } }
Giờ sửa lại code như sau:
using System.Collections.Generic; using System.Linq; // Nạp thư viện LINQ namespace CS020_ExtensionMethod { class Program { static void Main(string[] args) { List<int> ls = new List<int>() {1,2,3,4}; var ps = ls.Where(i => i >= 3); // Linq đã mở rộng thêm vào List phương thức Where } } }
Hãy tạo một phương thức tĩnh sau, phương thức này in chuỗi ra màn hình với màu Console nhập vào.
public static void Print(string s, ConsoleColor color = ConsoleColor.Yellow) { ConsoleColor lastColor = Console.ForegroundColor; Console.ForegroundColor = color; Console.WriteLine(s); Console.ForegroundColor = lastColor; }
Đây là một phương thức tĩnh bình thường, sử dụng nó để in một chuỗi ra màn hình, chuỗi nhập ở tham số thứ nhất
Print("Test string ...");
Giờ nếu muốn hàm Print
như một hàm mở rộng của đối tượng kiểu string, ta sẽ thực hiện như sau:
public static class MyExtensionMethods { public static void Print(this string s, ConsoleColor color = ConsoleColor.Yellow) { ConsoleColor lastColor = Console.ForegroundColor; Console.ForegroundColor = color; Console.WriteLine(s); Console.ForegroundColor = lastColor; } }
Bằng cách khai báo như trên, đã mở rộng string, thêm vào nó phương thức Print, hàm này sẽ được gọi trên đối tượng lớp string.
string s = "Chuỗi kiểm tra"; s.Print(); // Chuỗi kiểm tra (có màu vàng) "Xin chào các bạn!".Print(ConsoleColor.Red); // in ra "Xin chào các bạn!" có màu đỏ
Bằng cách như vậy bạn có thể mở rộng các lớp có sẵn.
Tham khảo mã nguồn CS020_ExtensionMethod, hoặc tải về tại ex020
Nguồn tin: XuanThuLab