Как получить глобальный доступ к типам перечислений в С#?
Это, наверное, глупый вопрос, но я не могу это сделать. Я хочу настроить некоторые перечисления в одном классе следующим образом:
public enum Direction { north, east, south, west };
Затем этот тип перечисления доступен для всех классов, чтобы, например, имел место какой-то другой класс:
Direction dir = north;
и иметь возможность передавать тип перечисления между классами:
public void changeDirection(Direction direction) {
dir = direction;
}
Я думал, что установка enum для публики сделает это автоматически возможным, но, похоже, это не видно за пределами класса, в котором я объявлял перечисление.
Ответы
Ответ 1
Вы можете сделать одну из двух вещей.
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
Eg.
public void changeDirection(ClassName.Direction direction) {
dir = direction;
}
Где ClassName
- это имя класса, в котором вы указали перечисление.
Ответ 2
Объявить перечисление в области пространства имен, например класса, но не в классе:
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 = ...
Ответ 3
Это общедоступно, но определение перечисления внутри класса делает его внутренним типом этого класса. Например:
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 }
}
Ответ 4
Поместите определение enum
внутри файла Program.cs
, но вне класса Program
. Это сделает тип enum
глобально доступным без необходимости ссылаться на имя класса.
namespace YourApp
{
enum Direction { north, east, south, west };
static class Program
{
}
}
Затем вы можете получить к нему доступ в любом месте в любом классе в пределах одного и того же пространства имен без необходимости указывать имя класса следующим образом:
Direction d;
d = Direction.north;
Ответ 5
Имел ту же проблему, когда Enum не работал с внешним пространством имен. Скомпилирована внешняя DLL и исправлена проблема.
DD