Extension Methods - Thêm Một Phương Thức Ngoài Vào Một Đối Tượng

Hôm nay tôi sẽ nói về một cách đơn giản để thêm một phương thức bất kỳ bên ngoài vào cách hành xử của đối tượng mà không hề ảnh hưởng đến code của class mô tả đối tượng đó.



Tôi sẽ đặc vấn đề ngắn gọn như sau, tôi có một đối tượng là Student, đối tượng này có hai thuộc tính Name, Index và không có phương thức hành xử nào. Giả sử tôi muốn in thông tin của từng học sinh với Name và Index tôi sẽ làm sao, chắc chắn sẽ thế này:

[code language="csharp"]
Console.WriteLine("Student #{0} Name = {1}", student.Index, student.Name);
[/code]

Như thế là quá đẹp rồi, và vấn đề là tôi có 10000 chổ trong ứng dụng của mình cần in thông tin như trên, và tôi nghĩ ra cách là viết một phương thức PrintInfo() cho class Student và mỗi lần muốn in thông tin thì gọi; xét về logic thì không chê được, nhưng chúng ta làm việc về mặt đối tượng  thì hoàn toàn không phù hợp vì đối tượng Student không thể có cách hành xử là tự print thông tin chính mình(ví dụ khi đi mua vé xe), thế thì làm cách nào giải quyết, không lẽ phải viết 10000 dòng code print thông tin như trên. Để làm điều khó khăn đó chúng ta nghĩ ngay đến Extension Methods, cách thực hiện như sau.

Tôi có lớp Student

[code language="csharp"]
// Lớp Student
public class Student
{
public string Name { set; get; }

public int Index { set; get; }
}
[/code]

Tôi tạo lớp StudentExt - Extension Methods phải static, để ý từ khóa this trong đối số của hàm ToInfo, chú ý rằng hàm ToInfo không có đối số(tường minh) truyền vào khi sử dụng nhé, đối số ta đang thấy(this Student student) chỉ thể hiện là hàm này chỉ dùng cho đối tượng Student và "this Student student" chính là đối tượng gọi ToInfo().

[code language="csharp"]
// Lớp chứa Extension Methods
public static class StudentExt
{
// không có đối số tường minh
public static string ToInfo(this Student student)
{
return string.Format("Student #{0} Name: {1}", student.Index, student.Name);
}

// Extension Methods với một đối số
public static string ToInfo(this Student student, string txtfont)
{
return string.Format("{0} #{1} Name: {2}",txtfont, student.Index, student.Name);
}
}
[/code]

Chúng ta dùng nó như sau.

[code language="csharp"]
static void Main(string[] args)
{
var student0 = new Student(){Name = "Nguyen A",Index = 0};
var student1 = new Student(){Name = "Nguyen B",Index = 1};

Console.WriteLine(student0.ToInfo());
Console.WriteLine(student1.ToInfo("Best student"));

Console.ReadKey();
}
[/code]

Kết quả:

[caption id="attachment_182" align="aligncenter" width="300"]Extension Methods tuanphamdg Phạm Tuân[/caption]

Chúc các bạn thành công!
Phạm Tuân


Chúc các bạn thành công!
PHẠM TUÂN