2009-09-13 28 views
9

Có thể, trong C#, để tạo các phương thức mở rộng trên lớp nhưng hạn chế khả năng hiển thị/trợ năng trong lớp không? (Ví dụ như mở rộng Phương pháp A trên lớp M là chỉ có thể trong lớp Z)Phương pháp mở rộng C# chỉ hiển thị và có thể truy cập trong một lớp ("riêng tư")

Ví dụ:

class A 
{ 
    String foo = ""; 
    String bar = foo.MakeMillionaire("arg"); 
} 

Trong ví dụ trên, chúng tôi muốn các phương pháp khuyến nông "MakeMillionaire" mở rộng lớp String chỉ để được nhìn thấy và có thể truy cập trong lớp A. Tôi có thể làm điều này bằng cách nào đó bằng cách định nghĩa phương thức mở rộng trong một lớp tĩnh trong lớp A không?

Chỉnh sửa: Thử sản lượng lớp lồng nhau thường xuyên "Lỗi: Phương pháp mở rộng phải được xác định trong lớp tĩnh cấp cao nhất".

+0

Khi bạn thử làm điều này, điều gì sẽ xảy ra? –

+0

Tôi nhận được "Lỗi: Phương pháp mở rộng phải được xác định trong lớp tĩnh cấp cao nhất" .... – Alex

Trả lời

15

Phương thức mở rộng chỉ có thể được xác định trong lớp ngoài không chung chung (không lồng nhau).

Điều tôi thường làm trong các trường hợp như vậy là tạo một lớp nội bộ tĩnh riêng biệt trong một không gian tên khác trong cùng một tệp, sau đó bao gồm không gian tên đó chỉ trong tệp đó.

Nó sẽ vẫn hiển thị với các lớp khác trong hội đồng đó; cách duy nhất để tránh điều đó là di chuyển lớp tiêu thụ (class A trong ví dụ của bạn) đến hội đồng của riêng nó, mà bạn có thể không muốn làm.

9

Khai báo các Phương thức mở rộng của bạn trong một không gian tên riêng biệt và bạn có thể bao gồm không gian tên đó trong các tệp cụ thể mà bạn muốn sử dụng chúng. Sau đó, khai báo ClassA (lớp bạn muốn sử dụng các phương thức mở rộng của bạn) trong một tệp riêng biệt và sử dụng không gian tên đó ở đầu lớp ClassA.cs. Bằng cách đó, chỉ có lớp đó sẽ có quyền truy cập vào các phương thức mở rộng đó.

Edit:

Cái gì như

sau
namespace Extension { 
    public static class ExtensionMethods { 
     public static string EnumValue(this MyEnum e) { 
      switch (e) { 
       case MyEnum.First: 
        return "First Friendly Value"; 
       case MyEnum.Second: 
        return "Second Friendly Value"; 
       case MyEnum.Third: 
        return "Third Friendly Value"; 
      } 
      return "Horrible Failure!!"; 
     } 
    } 
} 

ClassA.cs:

using Extension; 

public class ClassA{ 
    //Work your magic here, using the EnumValue Extension method 
    //wherever you want 
} 

ClassB.cs

public class ClassB{ 
    //EnumValue is not a valid Extension Method here. 
} 
Các vấn đề liên quan