How to use Extension Methods on .Net 2.0
.NET, C#, Tutorials June 24th, 2008Extension Method là điểm mới của .NET 3.0+, nếu bạn sử dụng trong .NET 2.0 với Visual Studio thì bạn sẽ được “tặng” lỗi liền :

Extension Methods sau khi compile thì thực chất chỉ là static methods, tuy nhiên để giúp IDE (Visual Studio) có thể nhận biết được static methods nào là extension methods để cho IDE có thể biết được kiểu dữ liệu nào có extension method nào (giúp IDE có list ra các hàm, cũng như không báo lỗi và compile được khi viết theo cú pháp của extension methods), compiler đã thêm attribute: ExtensionAttribute cho các static method (cũng như static class và assembly chứa nó) là extension methods. Thật không may, cái attributes này lại nằm trong System.Core.dll component (.Net 3.5 - cũng phải thôi, M$ không thể thêm cái attribute mới này vào trong các component đã được publish của .Net 2.0 được), vì thế khi chúng ta sử dụng Extension Methods cho project .net 2.0 sẽ nhận được thông báo lỗi như trên.
Tuy nhiên cũng thật may mắn vì khi thêm attribute ExtensionAttribute cho các static methods, compiler đã không chỉ rõ attribute này nằm ở component nào:
Vì thế chúng ta chỉ cần thêm attribute này vào project của mình:
namespace System.Runtime.CompilerServices
{
///
/// Indicates that a method is an extension method,
/// or that a class or assembly contains extension methods.
///
[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class | AttributeTargets.Assembly)]
public sealed class ExtensionAttribute : Attribute
{
}
}

July 17th, 2008 at 21:16
nhc có check cái tạo ra attribute giả này chưa? .Net Framework 2.0 có thể hiểu được khai báo kiểu “static Type Method(this Type Value)” không?
July 17th, 2008 at 22:38
Đã test thử rồi, thử cả tạo một project mới import cả cái assembly có cái attribute do mình định nghĩa, cả import cái System.Core.dll vẫn chạy ok.
Khi biên dịch ra mã IL thì thì code của nó vẫn bình thường (không có this).
Chỉ có thêm cái Custom Attribute vào Method, Class và Assembly thôi.
Trong hình là ví dụng về code IL của class Enumerable trong System.Core.dll của .Net 3.5. Nó vẫn là code bình thường như trên .Net 2.0.
Cái Attribute này chỉ dành cho IDE. Các lời gọi hàm của mình sau khi biên dịch vẫn chỉ là lời gọi hàm tới static methods.