2012-01-31 34 views
39

Tôi muốn ẩn các phương thức công khai khỏi danh sách thành viên intellisense. Tôi đã tạo một thuộc tính khi áp dụng cho một phương thức sẽ gây ra phương thức được gọi khi đối tượng của nó được xây dựng. Tôi đã làm điều này để hỗ trợ tốt hơn các lớp học một phần. Vấn đề là trong một số môi trường (chẳng hạn như Silverlight), sự phản chiếu không thể truy cập các thành viên riêng ngay cả những thành viên của các lớp con. Đây là một vấn đề vì tất cả công việc được thực hiện trong một lớp cơ sở. Tôi phải làm cho các phương thức này được công khai, nhưng tôi muốn chúng được ẩn khỏi intellisense, tương tự như cách các thuộc tính Obsolete hoạt động. Thành thật mà nói, bởi vì tôi là hậu môn về đóng gói đối tượng. Tôi đã thử những thứ khác nhau, nhưng không có gì thực sự hiệu quả. Phương thức vẫn hiển thị trong trình đơn thả xuống thành viên.Cách ẩn các phương thức công khai khỏi intellisense

Làm cách nào để giữ cho các phương thức công khai hiển thị trong trạng thái intellisense khi tôi không muốn chúng được gọi bởi khách hàng? Làm thế nào để có một câu hỏi thực sự, Philistines! Điều này cũng có thể áp dụng cho các thuộc tính MEF phải được công khai mặc dù đôi khi bạn muốn ẩn chúng khỏi các máy khách.

Cập nhật: Tôi đã trưởng thành với tư cách là nhà phát triển kể từ khi tôi đăng câu hỏi này. Tại sao tôi quan tâm nhiều đến việc ẩn giao diện là ngoài tôi.

+2

Không công khai chúng nếu bạn không muốn chúng được truy cập/sử dụng. – Oded

+0

Vì vậy, thay vì chỉ thêm các cuộc gọi đến các phương thức trong hàm tạo của một đối tượng, bạn đang thêm các thuộc tính và gọi chúng thông qua sự phản chiếu? Theo như bình luận của bạn về "hỗ trợ tốt hơn một phần các lớp học", không phải là những gì một phần phương pháp được cho? – cadrell0

+2

Triển khai giao diện rõ ràng có thể là một cách tiếp cận thay thế để xem xét. Các phương thức sau đó không phải là một phần của API công khai của lớp, nhưng chỉ hiển thị thông qua giao diện. –

Trả lời

-1

Mở rộng trên nhận xét của tôi về phương pháp từng phần. Hãy thử một cái gì đó như thế này

Foo.part1.cs

partial class Foo 
{ 
    public Foo() 
    { 
     Initialize(); 
    } 

    partial void Initialize(); 
} 

Foo.part2.cs

partial class Foo 
{ 
    partial void Initialize() 
    { 
     InitializePart1(); 
     InitializePart2(); 
     InitializePart3(); 
    } 

    private void InitializePart1() 
    { 
     //logic goes here 
    } 

    private void InitializePart2() 
    { 
     //logic goes here 
    } 

    private void InitializePart3() 
    { 
     //logic goes here 
    } 
} 
+0

Đây là điều cuối cùng tôi đã làm. * thở dài * – Jordan

+0

Vâng, không chính xác. Tôi chỉ sử dụng các phương thức riêng trong các lớp một phần mà tôi đã gọi từ lớp chính. Tôi có nhiều lớp học một phần, tôi điên. Cần giúp đỡ. * sigh * – Jordan

81

Sử dụng thuộc tính EditorBrowsable như vậy sẽ gây ra một phương pháp không được hiển thị trong IntelliSense:

[System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)] 
public void MyMethod() 
{ 
} 
+1

Vâng, tôi đã thử điều này. Nó không hoạt động. Phương pháp vẫn hiển thị trong danh sách thành viên. – Jordan

+12

@Jordan Tôi đã thử bản thân mình ngay bây giờ và nó không hiển thị phương pháp khi tôi tham khảo dll của thư viện. Tuy nhiên, nó cho thấy nếu dự án là trong cùng một giải pháp và tôi đang tham khảo dự án. –

+7

Vâng, đó là hành vi mong đợi. Nó không có ý định lọc các mục từ * bạn * khi bạn viết mã! –

15

Bạn đang tìm kiếm EditorBrowsableAttribute

Các mẫu sau đây cho thấy làm thế nào để che giấu thuộc tính của lớp từ IntelliSense bằng cách đặt giá trị thích hợp cho Thuộc tính EditorBrowsableAttribute. Xây dựng Class1 trong hội đồng của riêng mình.

Trong Visual Studio, hãy tạo giải pháp Ứng dụng Windows mới và thêm tham chiếu vào assembly có chứa Class1. Trong Form1 hàm tạo, khai báo một cá thể của Class1, hãy nhập tên của cá thể và nhấn phím thời gian để kích hoạt danh sách thả xuống IntelliSense của các thành viên Class1. Thuộc tính Độ tuổi không xuất hiện trong danh sách thả xuống.

using System; 
using System.ComponentModel; 

namespace EditorBrowsableDemo 
{ 
    public class Class1 
    { 
     public Class1() 
     { 
      // 
      // TODO: Add constructor logic here 
      // 
     } 

     int ageval; 

     [EditorBrowsable(EditorBrowsableState.Never)] 
     public int Age 
     { 
      get { return ageval; } 
      set 
      { 
       if (!ageval.Equals(value)) 
       { 
        ageval = value; 
       } 
      } 
     } 
    } 
} 
+14

editorbrowsable chỉ ẩn phương thức nếu bạn chỉ nhập dll, không phải nếu bạn đang tham chiếu một dự án khác trong giải pháp mà tôi nghĩ –

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