Sử dụng phương thức mở rộng (Extension Methods) trong C#

Sử dụng phương thức mở rộng (Extension Methods) trong C#

February 26, 2025 0 By Nam Vu

Có thể nhiều anh em đã biết đến kỹ thuật này trong C# rồi, nên bài viết này mình cũng chỉ viết ngắn gọn để anh em ôn lại kiến thức một chút và để anh em mới nếu chưa nghe qua có thể hiểu được tổng quan về Extension Method

Nói một cách đơn giản, phương thức mở rộng (Extension Method) là một cách tiện lợi để thêm phương thức vào các lớp mà mình không thể chỉnh sửa trực tiếp, thường là do chúng được cung cấp bởi một thư viện hoặc bên thứ ba.

Hãy cùng xem ví dụ về một lớp ShoppingCart chứa một tập hợp các đối tượng Product:

public class Product
{
    public string Name { get; set; }
    public decimal Price { get; set; }
}

public class ShoppingCart
{
    public List<Product> Products { get; set; } = new List<Product>();
}

Giả sử mình muốn tính tổng giá trị của tất cả các sản phẩm (Product) trong giỏ hàng (ShoppingCart). Tuy nhiên, mình không thể sửa đổi trực tiếp lớp này vì nó thuộc về một thư viện bên thứ ba và mình không có mã nguồn của nó. Trong trường hợp này, mình có thể sử dụng phương thức mở rộng để thêm chức năng mà mình cần.

Thêm phương thức mở rộng

Tạo một tệp class mới có tên OurExtensionMethods.cs và định nghĩa phương thức mở rộng như sau:

public static class OurExtensionMethods
{
    public static decimal TotalPrices(this ShoppingCart cartParam)
    {
        return cartParam.Products.Sum(p => p.Price);
    }
}
  • Từ khóa this đặt trước tham số đầu tiên (this ShoppingCart cartParam) đánh dấu phương thức này là một extension method.
  • Tham số đầu tiên (ShoppingCart cartParam) cho biết lớp nào có thể sử dụng phương thức mở rộng này – trong trường hợp này là ShoppingCart.
  • Bên trong phương thức, mình sử dụng cartParam để truy cập danh sách các Product trong giỏ hàng và tính tổng giá trị của chúng bằng cách cộng tất cả giá (Price) của sản phẩm.

Sử dụng phương thức mở rộng

Đoạn code sau đây minh họa cách sử dụng phương thức mở rộng vừa tạo:

ShoppingCart cart = new ShoppingCart();
cart.Products.Add(new Product { Name = "Laptop", Price = 1200 });
cart.Products.Add(new Product { Name = "Mouse", Price = 50 });

decimal total = cart.TotalPrices();
Console.WriteLine($"Tổng giá trị giỏ hàng: {total}");

Ở đây, mình gọi phương thức TotalPrices trên một đối tượng ShoppingCart như thể nó là một phần của lớp ShoppingCart, mặc dù thực tế nó là một phương thức mở rộng được định nghĩa trong một lớp khác.

.NET sẽ tự động tìm các lớp mở rộng nếu chúng nằm trong phạm vi (scope) của lớp hiện tại, tức là chúng phải thuộc cùng namespace hoặc trong một namespace đã được nhập bằng lệnh using.

Anh em cứ thử áp dụng phương thức mở rộng trong dự án của mình và cho mình biết kết quả nhé!

Cảm ơn anh em đã đọc bài viết!

#ntechdevelopers