2009-04-06 2 views
42

У меня есть библиотека классов, которая имеет пару пространств имен, содержащих только внутренние типы.Скрытие пространств имен, содержащих только внутренние типы в библиотеке классов?

Однако при использовании библиотеки классов в прикладном проекте пространства имен отображаются в intellisense, но, конечно, они пусты. Есть ли какой-либо способ полностью скрывать пространства имен при использовании intellisense в других проектах?

Я попытался применить EditorBrowsableAttribute ко всем внутренним классам, но то, что я хотел бы сделать, это применить это к пространству имен, что, конечно, невозможно.

Или, если мне это все равно, единственный вариант, который я должен просто переместить типы в пространство имен, которое содержит общедоступные типы?

+1

Это было тяжело для Google ... все продолжалось для людей, которые хотели скрыть класс внутри пространства имен или сборки. – Panzercrisis

ответ

43

Это зависит от того, как вы вашу библиотеку классов:

  • Если у вас есть проект библиотеки классов, содержащиеся в вашем решении и использовать ссылку на проект, вы всегда будете видеть, что пустое пространство имен с помощью Intellisense.
  • Если вы ссылаетесь на скомпилированную dll вашей библиотеки классов, вы не увидите пространство имен, появившееся в intellisense, если оно содержит только внутренние члены.

Попробуйте это:

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

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

Если вы ссылаетесь это через ссылку проекта, вы увидите пустое пространство имен. Если вы ссылаетесь на DLL, вы не будете.

+0

Прежде чем прочитать этот ответ, я начал организовывать наборы классов и т. д. во вложенные папки, сохраняя их в корневом пространстве имен проекта, но это действительно не очень хорошо. Я определенно могу жить с ними, только видимыми с ссылками на проекты, хотя теперь я собираюсь начать добавлять подпространства имен в. – Panzercrisis

5

Я столкнулся с этим раньше и не нашел решения, которое может работать или не работать в вашем проекте. Вместо определения пространства имен вы можете использовать вложенный статический класс?

+0

Да, я мог бы это сделать, но тогда мне нужно будет переписать все ссылки, так как вложенные классы должны будут быть частью квалификационного имени повсюду. то есть. Мне нужно написать это: var x = new NotReallyANamespace.ClassName(); вместо добавления директивы use. +1 для идеи, хотя :) –

+0

Я знаю, это далеко от совершенства :( –

+2

Теперь, когда C# использует 'static ', подход вложенного статического класса стал несколько более выполнимым. – stakx

Смежные вопросы