2012-01-31 13 views
39

Chcę ukryć publiczne metody z listy członków intellisense. Stworzyłem atrybut, który po zastosowaniu do metody spowoduje wywołanie metody, gdy jej obiekt zostanie skonstruowany. Zrobiłem to, aby lepiej wspierać klasy częściowe. Problem polega na tym, że w niektórych środowiskach (takich jak Silverlight) refleksja nie może uzyskać dostępu do prywatnych członków, nawet tych klas dzieci. Jest to problem, ponieważ cała praca jest wykonywana w klasie bazowej. Muszę upublicznić te metody, ale chcę, aby były ukryte przed intellisense, podobnie jak działa atrybut Obsolete. Szczerze mówiąc, ponieważ mówię o enkapsulacji obiektów. Próbowałem różnych rzeczy, ale nic nie zadziałało. Metoda nadal pojawia się w menu listy.Jak ukryć publiczne metody od intellisense

Jak zachować publiczne metody wyświetlania w intellisense, gdy nie chcę, aby były one wywoływane przez klientów? Jak to jest dla pytania prawdziwe, Filistyni! Może to również dotyczyć właściwości MEF, które muszą być publiczne, chociaż czasami trzeba je ukryć przed klientami.

Aktualizacja: Mam dojrzałe jako programista, ponieważ opublikowałem to pytanie. Dlaczego tak bardzo zależało mi na ukrywaniu interfejsu, jest poza mną.

+2

Nie zmuszaj ich do publicznej wiadomości, jeśli nie chcesz, żeby być dostępne/używane. – Oded

+0

Więc zamiast dodawać wywołania metod w konstruktorze obiektu, dodajesz atrybuty i wywołujesz je za pomocą odbicia? Jeśli chodzi o twoją uwagę na temat "lepszych klas częściowych", to czyż nie są to częściowe metody? – cadrell0

+2

Jawne implementowanie interfejsu może być alternatywnym podejściem do rozważenia. Metody te nie są częścią publicznego interfejsu API tej klasy, ale są widoczne tylko za pośrednictwem interfejsu. –

Odpowiedz

-1

rozszerzyć na mój komentarz na temat metod częściowych. Spróbuj coś takiego

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

To jest właśnie to, co zrobiłem. * wzdycha * – Jordan

+0

No, nie do końca. Po prostu użyłem prywatnych metod w klasach częściowych, które wywołałem z klasy podstawowej. Mam kilka klas cząstkowych, jestem szalony. Potrzebuję pomocy. * westchnienie * – Jordan

81

Korzystanie atrybut EditorBrowsable jak tak spowoduje metody nie mogą być pokazane w intellisense:

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

Tak, próbowałem tego. To nie działa. Metoda nadal wyświetla się na liście członków. – Jordan

+12

@Jordan Próbowałem go już teraz i nie pokazuje metody, gdy odwołuję się do biblioteki DLL. Jednak pokazuje, czy projekt jest w tym samym rozwiązaniu i odwołuję się do projektu. –

+7

Tak, to oczekiwane zachowanie. Nie ma na celu filtrowania przedmiotów od * ciebie * podczas pisania kodu! –

15

Szukasz EditorBrowsableAttribute

Poniższy przykład pokazuje, jak do ukrycia właściwość klasy firmy IntelliSense, ustawiając odpowiednią wartość dlaAtrybut EditorBrowsableAttribute. Zbuduj klasę 1 we własnym zespole.

W Visual Studio utwórz nowe rozwiązanie aplikacji dla systemu Windows i dodaj odniesienie do zespołu zawierającego Class1. W konstruktorze Form1 zadeklaruj wystąpienie klasy 1, wpisz nazwę instancji i naciśnij klawisz kropki, aby uaktywnić listę rozwijaną IntelliSense członków Class1. Właściwość Wiek nie pojawia się na liście rozwijanej.

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 ukrywa metodę tylko wtedy, gdy importujesz bibliotekę DLL, a nie, jeśli odwołujesz się do innego projektu w rozwiązaniu, które myślę –

Powiązane problemy