2008-08-07 31 views

Trả lời

20

Bạn có thể không tự động thêm các phương pháp để đối tượng hoặc các lớp học hiện có trong .NET, ngoại trừ bằng cách thay đổi nguồn cho lớp đó.

Bạn có thể, tuy nhiên, trong C# 3.0, sử dụng các phương pháp mở rộng, trong đó xem như các phương pháp mới, nhưng là phép thuật thời gian biên dịch.

Để làm điều này cho mã của bạn:

public static class StringExtensions 
{ 
    public static String trim(this String s) 
    { 
     return s.Trim(); 
    } 
} 

Để sử dụng nó:

String s = " Test "; 
s = s.trim(); 

này trông giống như một phương pháp mới, nhưng sẽ biên dịch một cách chính xác giống như mã này:

String s = " Test "; 
s = StringExtensions.trim(s); 

Chính xác bạn đang cố gắng hoàn thành điều gì? Có lẽ có những cách tốt hơn để làm những gì bạn muốn?

+0

Cảm ơn Lassevk, câu trả lời tuyệt vời :) Đáp lại "Chính xác thì bạn đang cố gắng làm gì?". Từng ngày và một lần nữa, tôi có nhu cầu thao tác chuỗi hoặc đối tượng khác. Thay vì phải gọi một hàm để làm điều này, tôi đã nghĩ tốt hơn nên gọi nó là một phương pháp. Tôi hiện đang viết ứng dụng web trong Asp.net và tôi không nghĩ có Asp.net 3.x, vì vậy, tôi sẽ phải đợi ngay bây giờ. Nhưng cảm ơn câu trả lời của bạn. – GateKiller

0

Bạn cần tạo phương thức tiện ích yêu cầu .NET 3.5. Phương thức cần phải tĩnh, trong một lớp tĩnh. Tham số đầu tiên của phương thức cần được bắt đầu bằng "this" trong chữ ký.

public static string MyMethod(this string input) 
{ 
    // do things 
} 

Sau đó bạn có thể gọi nó như

"asdfas".MyMethod(); 
0

Sử dụng trình biên dịch 3.5 bạn có thể sử dụng một phương pháp mở rộng:

public static void Trim(this string s) 
{ 
    // implementation 
} 

Bạn có thể sử dụng trên một dự án CLR 2.0 mục tiêu (3,5 biên dịch) bằng cách bao gồm hack này:

namespace System.Runtime.CompilerServices 
{ 
    [AttributeUsage(AttributeTargets.Method | AttributeTargets.Class | AttributeTargets.Assembly)] 
    public sealed class ExtensionAttribute : Attribute 
    { 
    } 
} 
4

Nghe có vẻ như bạn đang nói về phương pháp mở rộng của C#. Bạn thêm chức năng cho các lớp hiện có bằng cách chèn từ khóa "này" trước tham số đầu tiên. Phương thức này phải là một phương thức tĩnh trong một lớp tĩnh. Các chuỗi trong .NET đã có phương thức "Cắt", vì vậy tôi sẽ sử dụng một ví dụ khác.

public static class MyStringEtensions 
{ 
    public static bool ContainsMabster(this string s) 
    { 
     return s.Contains("Mabster"); 
    } 
} 

Vì vậy, bây giờ mỗi chuỗi có một phương pháp ContainsMabster rất hữu ích, mà tôi có thể sử dụng như thế này:

if ("Why hello there, Mabster!".ContainsMabster()) { /* ... */ } 

Lưu ý rằng bạn cũng có thể thêm các phương pháp mở rộng giao diện (ví dụ IList), có nghĩa là bất kỳ lớp nào triển khai giao diện đó cũng sẽ nhận phương thức mới đó.

Bất kỳ tham số bổ sung nào bạn khai báo trong phương thức mở rộng (sau thông số "this" đầu tiên) được coi là thông số bình thường.

Các vấn đề liên quan