2009-09-23 7 views
21

Ho un'interfaccia fluente per un processo di registrazione del contenitore IoC e contiene alcune classi utilizzate per creare le registrazioni.Nascondere GetHashCode/Equals/ToString da classi di interfaccia fluenti intellisense in Visual Studio for C#?

Per esempio, posso fare questo:

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

Tuttavia, ad ogni passo, dopo un punto, intellisense si apre mostrando i quattro metodi standard della classe Object, GetHashCode, Uguale, GetType e ToString.

Ho provato a sovrascrivere questi metodi in un paio di classi, allegando l'attributo EditorBrowsableAttribute a ciascuno, ma continuano a essere visualizzati. Non c'è modo per me di nasconderli?

Nota che non sto cercando di nasconderli dalla classe stessa, solo da intellisense.

In sostanza, mi piacerebbe questo:

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

Ecco quello che ho provato nella classe che viene restituito da 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(); 
} 

Questo chiaramente non ha funzionato. C'è qualcos'altro che posso provare?

Ho anche provato ad aggiungere un nuovo metodo, non sovrascritto da Object e applicare lo stesso attributo a quello, e anche questo si presenta, quindi chiaramente l'attributo non sta facendo quello che pensavo avrebbe fatto.

Ho notato la nota nella documentazione per non nascondere le cose dallo stesso assembly, ma ho provato a creare un nuovo progetto e continuano a essere visualizzate.

+0

Interessante, la documentazione di EditorBrowsableState dice chiaramente * Ad esempio, il motore IntelliSense in Visual Studio non mostra mai metodi o proprietà contrassegnati come Mai. * Ho provato in un piccolo progetto di test e ottengo gli stessi risultati. Anche se controllo "Nascondi membri avanzati" e utilizzo 'EditorBrowsableState.Advanced', il membro viene comunque visualizzato nell'elenco. Dispari. –

+0

Ho trovato la risposta, modifico la domanda. –

+0

Buon risultato. Mai non è sempre mai. –

risposta

18

Secondo thread, è di progettazione. I metodi/proprietà decorati con EditorBrowsable(EditorBrowsableState.Never) sono nascosti solo da intellisense se fanno parte di una classe che si trova in un altro assembly referenziato. L'assemblea non dovrebbe essere parte della stessa soluzione.

21

Ok, ho trovato la soluzione, è stata in parte colpa mia e documentazione parzialmente incompleta.

La mia colpa era che non avevo taggato tutti i metodi nella classe corretta, ma anche nel correggere ciò, i metodi si presentavano ancora.

spegne la nota nella documentazione, che recita:

In Visual C#, EditorBrowsableAttribute non sopprime membri di una classe nello stesso assembly.

dovrebbe essere effettivamente (sottolineatura mia):

In Visual C#, EditorBrowsableAttribute non sopprime membri di una classe nella stessa soluzione aperta.

ho tagged i metodi nella classe appropriata, ha una ricostruzione completa, ha creato un nuovo progetto al di fuori del file di soluzione, ha fatto riferimenti ai file ai file compilati dal mio progetto CIO, ed ecco, i metodi sono scomparsi .

Lascerò la domanda se qualcuno ha questo problema.

+0

Questo è così fastidioso! Solitamente voglio nascondere variabili che richiedono 'lock'ing ed esporre una proprietà che esegue il locking. Se non riesco a farlo nell'assemblea, sto sviluppando qual è il significato? Se non voglio usare una variabile/proprietà/metodo al di fuori di un assembly, imposterei il suo accessor su 'private' o' internal'! VB.NET è almeno più ragionevole su questo problema. 'EditorBrowsableState.Never' ** always ** nasconde qualsiasi cosa venga applicata. –

+1

E il metodo GetType()? Sei riuscito a nasconderlo? – mynkow

+0

@mynkow Basta introdurre il metodo 'public new Type GetType()' e lasciarlo 'return base.GetType();' – tm1

Problemi correlati