2009-09-23 6 views
21

Posiadam płynny interfejs do procesu rejestracji kontenera IoC, a to zawiera klasy, które są używane do budowania rejestracji.Ukrywanie GetHashCode/Equals/ToString z płynnych klas interfejsu intellisense w Visual Studio dla C#?

Na przykład, można to zrobić:

builder.Register<IFoo>().From.ConcreteType<Foo>(); 

jednak, w każdym etapie po kropce IntelliSense wyskakuje pokazano cztery standardowe metody z klasy obiektów, GetHashCode równa, gettype i ToString.

Próbowałem przesłonić te metody w kilku klasach, dołączając do nich atrybuty EditorBrowsableAttribute, ale one nadal się wyświetlają. Czy nie ma sposobu, aby je ukryć?

Zauważ, że nie próbuję ukryć ich przed samą klasą, tylko z intellisense.

Zasadniczo chciałbym to:

      +---------------+ 
builder.Register<IFoo>().|As    | 
         |By    | 
         |Equals   | <-- remove this 
         |From   | 
         |GetHashCode | <-- and this 
         |GetType  | <-- as well as this 
         |ToString  | <-- and finally this 
         +---------------+ 

Oto co próbowałem w klasie, który jest zwracany z Register<T>:

[EditorBrowsable(EditorBrowsableState.Never)] 
public override Boolean Equals(Object obj) 
{ 
    return base.Equals(obj); 
} 

[EditorBrowsable(EditorBrowsableState.Never)] 
public override Int32 GetHashCode() 
{ 
    return base.GetHashCode(); 
} 

[EditorBrowsable(EditorBrowsableState.Never)] 
public override String ToString() 
{ 
    return base.ToString(); 
} 

To wyraźnie nie działa. Czy jest coś jeszcze, co mogę spróbować?

Próbowałem też dodać nową metodę, nie zastąpioną przez Object, i stosując ten sam atrybut do tego, i to też pokazuje, więc wyraźnie atrybut nie robi tego, co myślałem, że to zrobi.

Zauważyłem notatkę z dokumentacji o tym, że nie ukrywam rzeczy z tego samego zespołu, ale próbowałem stworzyć nowy projekt i nadal się tam pojawiają.

+0

Interesujące, dokumentacja EditorBrowsableState wyraźnie mówi * Na przykład silnik IntelliSense w Visual Studio nigdy nie pokazuje metod lub właściwości, które są oznaczone jako Never. * Próbowałem w małym projekcie testowym i otrzymałem takie same wyniki jak ty. Nawet jeśli sprawdzę "Ukryj zaawansowanych członków" i użyj 'EditorBrowsableState.Advanced', to element nadal będzie widoczny na liście. Dziwny. –

+0

Znalazłem odpowiedź, będę edytować pytanie. –

+0

Dobre znalezisko. Nigdy nie zawsze nie jest. –

Odpowiedz

18

Zgodnie z thread jest to zgodne z projektem. Metody/właściwości ozdobione EditorBrowsable(EditorBrowsableState.Never) są ukryte tylko w intellisense, jeśli są częścią klasy, która znajduje się w innym zespole referencyjnym. Zestaw nie powinien stanowić części tego samego rozwiązania.

21

Ok, znalazłem rozwiązanie, częściowo było to moja wina, a częściowo niekompletna dokumentacja.

Moja wina polegała na tym, że nie oznaczono wszystkich metod we właściwej klasie, ale nawet po ich skorygowaniu metody wciąż się pojawiały.

Okazuje się notatkę w dokumentacji, który brzmi:

w Visual C#, EditorBrowsableAttribute nie tłumić członków z klasy w tym samym zespole.

rzeczywiście powinny być (Kopalnia nacisk):

w Visual C#, EditorBrowsableAttribute nie tłumić członków z klasy w tym samym otwartego rozwiązania.

I określili metody opisane w odpowiedniej klasie, czy pełna odbudowa, stworzył nowy projekt poza pliku rozwiązanie, odwoływał plik do skompilowanych plików z mojego projektu IoC, i oto, metody zniknął .

Zostawię to pytanie na wypadek, gdyby ktoś inny miał ten problem.

+0

To jest tak denerwujące! Zazwyczaj chcę ukryć zmienne, które wymagają 'lock'ing i ujawnić właściwość, która blokuje. Jeśli nie mogę tego zrobić w zespole, rozwijam to, jakie jest znaczenie? Jeśli nie chcę używać zmiennej/właściwości/metody poza złożeniem, ustawiłbym jego akcesor na 'private' lub' internal'! VB.NET jest co najmniej bardziej rozsądny w tej kwestii. 'EditorBrowsableState.Never' ** always ** ukrywa wszystko, do czego zostanie zastosowane. –

+1

Co z metodą GetType()? Udało ci się to ukryć? – mynkow

+0

@mynkow Wystarczy wprowadzić metodę 'public new Type GetType()' i niech 'zwróci base.GetType();' – tm1

Powiązane problemy