C# cơ bản .NET Core

Các phương thức mở rộng trong C#

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
        }
    }
}

Khai báo phương thức mở rộng

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:

  • Chuyển khai báo Print trong một lớp tĩnh
  • Đảm bảo Print là phương thức tĩnh
  • Tham số đầu tiên của hàm là kiểu string (lớp mà phương thức mở rộng sẽ thêm vào) cho thêm từ khóa this vào phía trước kiểu này - để cho biết sẽ mở rộng lớp string với phương thức này.
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


Đăng ký nhận bài viết mới