2009-04-06 9 views
42

Tengo una biblioteca de clases que tiene un par de espacios de nombres que contienen solo tipos internos.Ocultar espacios de nombres que contienen solo tipos internos en una biblioteca de clases?

Sin embargo, cuando se utiliza la biblioteca de clases en un proyecto de aplicación, los espacios de nombres aparecen en intellisense, pero por supuesto están vacíos. ¿Hay alguna manera de ocultar los espacios de nombres por completo cuando uso intellisense en otros proyectos?

He tratado de aplicar EditorBrowsableAttribute a todas las clases internas también, pero lo que me gustaría hacer es aplicar eso al espacio de nombres, lo cual es por supuesto imposible.

¿O es que, si me importa lo suficiente, la única opción es mover los tipos a un espacio de nombres que contenga tipos públicos?

+1

Esto fue un poco difícil para Google ... todo seguía surgiendo para las personas que querían esconder una clase dentro de un espacio de nombres o una asamblea. – Panzercrisis

Respuesta

43

Depende de lo que está haciendo referencia a su biblioteca de clases:

  • Si usted tiene el proyecto de biblioteca de clases contenida en la solución y utilizar una referencia de proyecto, siempre vas a ver ese espacio de nombres vacío a través de Intellisense.
  • Si hace referencia a un dll compilado de la biblioteca de su clase, no verá aparecer el espacio de nombres en intellisense, siempre que contenga solo miembros internos.

Prueba esto:

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

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

Si hace referencia a esto a través de una referencia de proyecto, verá el espacio de nombres vacío. Si hace referencia a un archivo DLL, no lo hará.

+0

Antes de leer esta respuesta, estaba empezando a Organizar conjuntos de clases y cosas en subcarpetas, manteniéndolos en el espacio de nombres raíz del proyecto, pero eso realmente no se sentía bien. Definitivamente puedo vivir con ellos solo siendo visible con referencias de proyecto, así que ahora voy a empezar a agregar los espacios de los sub-nombres en – Panzercrisis

5

Me he encontrado con esto antes y no he encontrado ninguna solución, solo una solución alternativa que puede o no funcionar en su proyecto. En lugar de definir un espacio de nombres, ¿podría usar una clase estática anidada?

+0

Sí, podría hacerlo, pero luego tendría que volver a cablear todas las referencias, ya que las clases anidadas necesitarán ser parte del nombre calificador por todas partes. es decir. Necesitaría escribir esto: var x = new NotReallyANamespace.ClassName(); en lugar de solo agregar la directiva using. +1 por idea, aunque :) –

+0

Lo sé, es un largo camino desde la perfección :( –

+2

Ahora que C# tiene 'using static', el enfoque de clase estática anidada se ha vuelto algo más factible. – stakx

Cuestiones relacionadas