Как получить глобальный доступ к типам перечислений в C #? - PullRequest
32 голосов
/ 16 мая 2010

Это, наверное, глупый вопрос, но я не могу этого сделать. Я хочу настроить перечисления в одном классе, например:

public enum Direction { north, east, south, west };

Тогда этот тип enum будет доступен всем классам, чтобы, например, другой класс мог иметь:

Direction dir = north;

и иметь возможность передавать тип перечисления между классами:

public void changeDirection(Direction direction) {
   dir = direction;
}

Я думал, что установка enum в public сделает это автоматически возможным, но, кажется, он не виден вне класса, в котором я объявил enum.

Ответы [ 4 ]

52 голосов
/ 16 мая 2010

Вы можете сделать одну из двух вещей.

1- Переместить объявление перечисления за пределы класса

Сегодня у вас, вероятно, есть что-то подобное

public class ClassName
{
  public enum Direction
  {
    north, south, east, west
  }
  // ... Other class members etc.
}

Что изменится на

public class ClassName
{      
  // ... Other class members etc.
}

// Enum declared outside of the class
public enum Direction
{
  north, south, east, west
}

2- Ссылка на перечисление с использованием имени класса

ClassName.Direction.north

Например.

public void changeDirection(ClassName.Direction direction) { 
   dir = direction; 
}

Где ClassName - это имя класса, в котором вы объявили перечисление.

14 голосов
/ 16 мая 2010

Объявите enum в области имен пространства, как класс, но не в классе:

namespace MyApplication
{
   public enum Direction { north, east, south, west };
}

Если enum объявлен в области видимости класса, вы также должны сделать этот класс общедоступным:

namespace MyApplication
{
   public class MyClass
   {
      public enum Direction { north, east, south, west };
   }
}

Использование:

MyClass.Direction dir = ...
4 голосов
/ 16 мая 2010

Он общедоступен, но определение перечисления внутри класса делает его внутренним типом этого класса. Например:

namespace MyNamespace
{
    public class Foo
    {
        public enum MyEnum { One, Two, Three }
    }
}

Чтобы получить доступ к этому перечислению из другого класса в пространстве имен MyNamespace, вы должны ссылаться на него как Foo.MyEnum, а не просто MyEnum. Если вы хотите сослаться на него как на MyEnum, объявите его только внутри пространства имен, а не внутри класса:

namespace MyNamespace
{
    public class Foo { ... }

    public enum MyEnum { One, Two, Three }
}
1 голос
/ 25 июля 2014

Поместите определение enum в файл Program.cs, но вне класса Program. Это сделает тип enum глобально доступным без ссылки на имя класса.

namespace YourApp
{    
    enum Direction { north, east, south, west };

    static class Program
    {   
    }
}

Затем вы можете получить к нему доступ в любом месте в любом классе в том же пространстве имен без необходимости указывать имя класса следующим образом:

Direction d;
d = Direction.north;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...