С#: Access Enum из другого класса

Я знаю, что могу поместить свое перечисление в область пространства имен класса, чтобы каждый мог получить доступ к нему в том же пространстве имен.

// defined in class2
public enum Mode { Selected, New, }  

Я хочу получить доступ к этому перечислению из

public class1
{
   var class2 = new class2();
   // Set the Mode
   class2.Mode = Model.Selected
}

Как это возможно, без использования пространства имен?

Ответ 1

Если вы пытаетесь сделать то, что описано ниже, это не сработает...

    public class MyClass1
    {
        private enum Mode { New, Selected };
        public Mode ModeProperty { get; set; }
    }

    public class MyClass2
    {
        public MyClass2()
        {
            var myClass1 = new MyClass1();

            //this will not work due to protection level
            myClass1.ModeProperty = MyClass1.Mode.
        }
    }

Что вы могли бы сделать, однако, ниже, что будет работать...

    public interface IEnums
    {
        public enum Mode { New, Selected };
    }

    public class MyClass1
    {
        public IEnums.Mode ModeProperty { get; set; }
    }

    public class MyClass2
    {
        public MyClass2()
        {
            var myClass1 = new MyClass1();

            //this will work
            myClass1.ModeProperty = IEnums.Mode.New;
        }
    }

Ответ 2

Вы можете объявить перечисление вне класса:

namespace MyNamespace
{
    public enum MyEnum
    {
        Entry1,
        Entry2,
    }
}

И затем вы можете добавить using MyNamespace;, где он должен использоваться.

Ответ 3

Ответ Аарона очень приятный, но я считаю, что есть намного лучший способ сделать это:

public static class class1
{
    public void Run()
    {
        class2.Mode mode = class2.Mode.Selected;

        if (mode == class2.Mode.Selected)
        {
            // Do something crazy here...
        }
    }
}

public static class class2
{
    public enum Mode
    { 
        Selected, 
        New
    } 
}

Нет смысла усложнять это. Это простая задача.

Все лучшие

Крис.

Ответ 4

Да:

class2.Mode = class2.Mode.Selected

Но обратите внимание, что у вас не может быть вложенного типа, который имеет то же имя, что и один из членов внешнего класса, поэтому этот код не будет компилироваться. Либо перечисление, либо свойство нужно будет назвать чем-то другим. Имя вашего класса и имя переменной конфликтуют, делая это немного сложнее.

Чтобы сделать это более общий ответ, если у вас есть это:

public class Foo
{
    public SomeEnum SomeProperty { get; set; }

    public enum SomeEnum {
        Hello, World
    }
}

Затем этот код назначит значение перечисления для свойства:

Foo foo = new Foo();
foo.SomeProperty = Foo.SomeEnum.Hello;