2009-04-06 19 views
42

Ho una libreria di classi che ha un paio di spazi dei nomi contenenti solo tipi interni.Nascondere spazi dei nomi contenenti solo tipi interni in una libreria di classi?

Tuttavia, quando si utilizza la libreria di classi in un progetto di applicazione, gli spazi dei nomi vengono visualizzati in intellisense, ma ovviamente sono vuoti. C'è un modo per me di nascondere completamente gli spazi dei nomi quando si usa intellisense in altri progetti?

Ho provato ad applicare EditorBrowsableAttribute anche a tutte le classi interne, ma quello che mi piacerebbe fare sarebbe applicarlo allo spazio dei nomi, che è ovviamente impossibile.

Oppure, se mi interessa abbastanza, l'unica opzione che devo spostare i tipi in uno spazio dei nomi che contiene tipi pubblici?

+1

Questo è stato un po 'difficile per Google ... tutto continuava a venire per le persone che volevano nascondere una classe all'interno di un namespace o di un assembly. – Panzercrisis

risposta

43

Dipende da come si sta referenziare la tua libreria di classi:

  • Se avete il progetto di libreria di classi contenute all'interno della soluzione e utilizzare un riferimento al progetto, avrete sempre vedere che spazio dei nomi vuoto tramite Intellisense.
  • Se si fa riferimento a una DLL compilata della libreria di classi, non si vedrà lo spazio dei nomi apparire in intellisense, purché contenga solo membri interni.

Prova questo:

namespace ClassLibrary1 
{ 
    namespace Internal 
    { 
     internal class InternalClass 
     { 
      public int internalStuff { get; set; } 
     } 
    } 

    namespace Public 
    { 
     public class PublicClass 
     { 
      public int publicStuff { get; set; } 
     } 
    } 
} 

Se si fa riferimento a questo tramite un riferimento al progetto, si vedrà lo spazio dei nomi vuoto. Se fai riferimento a una dll di esso, non lo farai.

+0

Prima di leggere questa risposta, stavo iniziando a Organizzare gruppi di classi e materiale in sottocartelle mantenendoli nel namespace di root del progetto, ma in realtà non sembrava giusto. Posso sicuramente vivere con loro solo essendo visibili con riferimenti di progetto, quindi ora inizierò ad aggiungere i sotto namespace in – Panzercrisis

5

Mi sono imbattuto in questo prima e non ho trovato alcuna soluzione, solo una soluzione che può o non può funzionare nel tuo progetto. Invece di definire uno spazio dei nomi potresti usare una classe statica annidata?

+0

Sì, potrei farlo, ma poi avrei bisogno di ricablare tutti i riferimenti, poiché le classi annidate dovranno far parte del nome di qualifica ovunque. vale a dire. Avrei bisogno di scrivere questo: var x = new NotReallyANamespace.ClassName(); invece di aggiungere semplicemente la direttiva using. +1 per idea però :) –

+0

Lo so, è molto lontano dal perfetto :( –

+2

Ora che C# ha 'using static', l'approccio della classe statica nidificata è diventato un po 'più fattibile – stakx

Problemi correlati