2010-05-31 10 views
12

The IHideObjectMembers trick (a.k.a IFluentInterface) può essere utilizzato per es. in fluenti implementazioni dell'interfaccia per nascondere i membri System.Object da IntelliSense. (Se non si conosce questo trucco, si può leggere su di esso attraverso il link qui sopra, sto solo ripetendo solita dichiarazione dell'interfaccia qui :)VS IntelliSense - IFluentInterface/IHideObjectMembers non funziona. Perché?

using System; 
using System.ComponentModel; 

[EditorBrowsable(EditorBrowsableState.Never)] 
public interface IHideObjectMembers 
{ 
    [EditorBrowsable(EditorBrowsableState.Never)] bool Equals(object obj); 
    [EditorBrowsable(EditorBrowsableState.Never)] int GetHashCode(); 
    [EditorBrowsable(EditorBrowsableState.Never)] Type GetType(); 
    [EditorBrowsable(EditorBrowsableState.Never)] string ToString(); 
} 

Ora sto dovrei essere in grado di nascondere System.Object membri su un altro tipo come segue:

public class SomeClass : IHideObjectMembers { ... } 

o:

public interface ISomeInterface : IHideObjectMembers { ... } 

ho provato questo sia VS 2008 Express e VS 2008 standard. Tuttavia, nessun membro è nascosto da IntelliSense. Ho usato il EditorBrowsableAttribute in diversi progetti e ha sempre funzionato bene; tuttavia, non funziona in questo particolare scenario.

http://i48.tinypic.com/vhb4fq.jpg

Se le cose fossero andate come previsto, mi avrebbe solo visto il metodo SomeMethodTwo.

Mi manca qualcosa?


P.S .: È possibile dedurre il mio codice di esempio dalle dichiarazioni e lo screenshot. Ho una classe SomeClass con un singolo metodo fittizio chiamato SomeMethodTwo. Molto semplice. Ho non reimplementato i quattro metodi System.Object in questa classe, in quanto ciò non dovrebbe essere necessario.

+0

Negli ultimi versioni di Visual Studio (2015, 2017) , 'IHideObjectMembers' /' IFluentInterface' è reso inutile da un bug di Roslyn; vedere https://github.com/dotnet/roslyn/issues/4434. – stakx

risposta

7

Il trucco funziona se non si utilizza

var x = new SomeClass(); 

ma esplicitamente utilizzare l'interfaccia che eredita da IHideObjectMembers

ISomeInterface x = new SomeClass(); 

var prende il tipo della classe concreta. Quindi IntelliSense cercherà object.ToString() e non IHideObjectMembers.ToString(). Il primo non è decorato con lo EditorBrowsableAttribute mentre quello successivo lo è.

Daniel Cazzulino si riferisce esplicitamente al interfacce nel suo post

che abbiamo fatto questo con tutte le interfacce nella nostra API fluente

12

Prima che una soluzione di lavoro è stato pubblicato (vedi sopra), ho studiato e sperimentato un po ', e ho trovato questo:

  • IntelliSense deve essere detto di ignorare le proprietà contrassegnate con un EditorBrowsableState pari Advanced o Never . Questo risultato è ottenuto in Visual Studio tramite la voce di menu Strumenti Opzioni ...editor di testoC#IntelliSenseNascondi membri avanzati.

  • Il trucco IHideObjectMembers funziona solo da "altri" assiemi e solo quando il progetto che utilizza IHideObjectMembers non viene caricato nella stessa soluzione.

  • Nascondere membri non statici di object a volte non funziona se fatto tramite un'interfaccia IHideObjectMembers, ma funziona quando i metodi sono esplicitamente sovrascritti direttamente nella classe ... che fa, purtroppo, la tecnica si nasconde mostrato meno utile.

Fonti di questi indizi:

+0

Interessante. Non sono stato in grado di farlo funzionare all'esterno o all'interno della soluzione utilizzando VS 2010. –

+1

+1 può credere che questo sia solo il secondo upvot sul tuo lavoro. (Cercando di diagnosticare lo stesso su VS10) –

+1

NB non era un problema VS10 - tutto ciò che cambia è che non ci sono le impostazioni Nascondi membri avanzati da controllare. Funziona fin tanto che non è un riferimento al progetto. Un aspetto negativo che ho notato è che Ctrl., L'interfaccia implementa esplicitamente ora genera i 4 metodi (che si offre solo se manca un "metodo reale") ma suppongo che la vita andrà avanti. (Lo stesso valore negativo si applica a VS08) –

4

Questo trucco funziona solo quando si utilizzano tipi inclusi nelle DLL di riferimento. Questi assembly referenziati non possono essere riferimenti a progetti di Visual Studio. Se fai riferimento alla DLL, il trucco dovrebbe funzionare per te.

Problemi correlati