Доступ к перечислению в другом пространстве имен - PullRequest
3 голосов
/ 13 июля 2009

Я использую C # в VS2005. У меня есть библиотека классов, которая содержит несколько перечислений, общих для ряда различных проектов. При доступе к одному из этих перечислений я должен указать полный путь к пространству имен к перечислению, даже если я объявил директиву using для пространства имен, содержащего перечисление.

Например, у меня есть следующее перечисление:

namespace Company.General.Project1
{
   public static class Rainbow
   {
    [Flags]
    public enum Colours
    {
      Red,
      Blue,
      Orange
    }
  }
}

Тогда в другом проекте у меня есть:

using Company.General.Project1;

namespace Company.SpecialProject.Processing
{
  public class MixingPallette
  {
    int myValue = Company.General.Project1.Colours.Red;
  }
}

Несмотря на то, что у меня есть директива «Using», ссылающаяся на проект, который содержит класс enum, мне все еще нужно написать enum. Почему я не могу сделать следующее ...

using Company.General.Project1;

namespace Company.SpecialProject.Processing
{
  public class MixingPallette
  {
    int myValue = Colours.Red;
  }
}

Ответы [ 2 ]

15 голосов
/ 13 июля 2009

Ваше перечисление не просто в пространстве имен - это вложенный тип. Фактически, ваш примерный «рабочий» код не будет работать, он должен быть

int myValue = (int) Company.General.Project1.Rainbow.Colours.Red;

(не только вам нужно включить часть Rainbow, но также не существует неявного преобразования из enum в int.)

Сделайте ваше перечисление типом верхнего уровня:

namespace Company.General.Project1
{
    [Flags]
    public enum Colours
    {
        Red,
        Blue,
        Orange
    }
}

Тогда вы сможете написать:

using Company.General.Project1;

...

Colours x = Colours.Red;
int y = (int) Colours.Red;

(Обратите внимание, что для эффективного использования [Flags] вы должны назначать значения явно, например, 1, 2, 4, 8 ...)


РЕДАКТИРОВАТЬ: я предполагал, что вы действительно хотите иметь возможность использовать Colours.Red и т. Д. Вы можете сохранить свою текущую структуру, используя вложенный тип, и просто напишите:

Rainbow.Colours x = Rainbow.Colours.Red;
int y = (int) Rainbow.Colours.Red;

Однако, если у вас нет особой причины делать перечисление вложенным, я бы не стал.

0 голосов
/ 13 июля 2009

Вы можете переместить свои перечисления из статического класса - они могут существовать самостоятельно. Так что это будет работать:

namespace Company.General.Project1
{
  [Flags]
  public enum Colours
  {
    Red,
    Blue,
    Orange
  }
}

using Company.General.Project1;

namespace Company.SpecialProject.Processing
{
  public class MixingPallette
  {
    int myValue = (int)Colours.Red;
  }
}

Но если вы храните enum в этом статическом классе, то на него можно ссылаться только в этом контексте:

using Company.General.Project1;

namespace Company.SpecialProject.Processing
{
  public class MixingPallette
  {
    int myValue = (int)Rainbow.Colours.Red;
  }
}
...