ใน .NET Framework 3.5 ได้แนะนำ language feature ใหม่ที่เรียกว่า Extension Method
เป็นสิ่งที่ทำให้เราสามารถเรียก static method (หรือ Function ใน Module) ได้ราวกับมันเป็น method ของคลาสอะไรก็ได้ที่เราต้องการ
ตามปกติแล้วถ้าเราอยากเพิ่มเมธอดให้กับคลาสอะไรบางอย่าง เราอาจทำได้โดยการ inherit คลาสนั้นมา แล้วก็เขียนเมธอดเองในคลาสลูกนั้น
แต่ Extension Method อนุญาตให้เราเขียน static method ขึ้นมาลอยๆ แล้วนำไปเรียกใช้กับคลาสที่เราต้องการได้ทันที
ตัวอย่างเช่น
เราต้องการทำ function สำหรับ format date ให้เป็น string
สมมติเรามี Module อยู่ตัวนึง ข้างในมีฟังค์ชั่น
Public Function TestFormatDate(ByVal d As Date) As String
Return d.Day & "/" & d.Month & "/" & d.Year
End Function
ปกติเวลาจะเรียกใช้ก็คือ
Dim d as Date = Now Console.WriteLine(TestFormatDate(d))
แต่เราสามารถทำฟังค์ชั่นนี้ให้กลายเป็น Extension Method ได้โดยการติด Attribute Exntesion เข้าไปที่หัวฟังค์ชั่น
ซึ่ง ExtensionAttribute นี้อยู่ใน Namespace System.Runtime.CompilerServices
ดังนั้นโดยรวมแล้ว code ก็จะเป็น
Imports System.Runtime.CompilerServices
Public Module TestModule
<Extension()> _
Public Function TestFormatDate(ByVal d As Date) As String
Return d.Day & "/" & d.Month & "/" & d.Year
End Function
End Module
หรือ syntax ในภาษา c# ไม่ต้องใช้ Attribute อะไร เพียงแต่ใช้ keyword ว่า this
public static class TestModule
{
public static string TestFormatDate(this DateTime d)
{
return d.Day + "/" + d.Month + "/" + d.Year;
}
}
ซึ่งจะทำให้เราสามารถเรียกใช้ฟังค์ชั่นแบบนี้ได้
Dim d as Date = Now Console.WriteLine(d.TestFormatDate())
สังเกตว่า parameter ตัวแรกจะหายไป เนื่องจากเมธอดนี้ถือว่ามันจะไปเกาะกับคลาสประเภทนั้นๆ ซึ่งในที่นี้ก็คือคลาส Date
การเขียนแบบนี้จะช่วยให้ code สามารถอ่านได้ง่ายขึ้น เขียนได้ลื่นไหลไม่ติดขัดมากขึ้น เพราะพอกดจุด “.”
Intellisense ของ Visual Studio มันก็แสดงรายการเมธอดที่เป็นไปได้ขึ้นมาให้เองทั้งหมด
ไม่ต้องย้อนกลับไปพิมพ์ชื่อฟังค์ชั่น ก่อนชื่อตัวแปร

28/04/2010 at 17:44
ยอดเยี่ยมมากครับ เป็นกำลังใจให้