2010-12-14 14 views
10

Wiem, że mogę umieścić moje wyliczenie w obszarze Przestrzeń nazw klasy, aby każdy mógł uzyskać do niego dostęp w tym samym obszarze nazw.C#: Dostęp do Enum z innej klasy

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

Co chcę jest dostęp do tego wyliczenia z

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

Czy to jakoś możliwe bez użycia obszar przestrzeni nazw?

+0

Naprawdę cię tam nie rozumiałem ... możesz uzyskać dostęp do klas zdefiniowanych w klasach tylko z obiektów, tak jak to robisz, więc w czym problem? – Machinarius

+0

Dlaczego, na Boga, próbujesz uniknąć używania kwalifikatora przestrzeni nazw? Ponadto "Obszar przestrzeni nazw klasy" nie jest zbyt jasny. –

+1

Moim zdaniem powinieneś naprawdę zdefiniować enum w swoim pliku. W ten sposób nie miałbyś zagnieżdżonych klas do odniesienia. – froeschli

Odpowiedz

7

Jeśli próbujesz robić to, co opisany poniżej nie zadziała ...

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. 
     } 
    } 

Co można zrobić, to poniżej, która zadziała ...

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; 
     } 
    } 
+0

@Lisa Edytowałem odpowiedź, aby być bardziej zgodną z tym, co myślę, co próbujesz zrobić ... jeśli nie ... to druga odpowiedź jest w historii ... :) –

+6

Dostaję interfejs nie mogę zadeklarować typów podczas używania ten kod –

+0

Tak samo ja, oprócz komentarza Idana Shechtera "Dostaję interfejs nie może zadeklarować typów podczas korzystania z tego kodu". – fletchsod

4

Tak:

class2.Mode = class2.Mode.Selected 

Należy jednak pamiętać, że nie można mieć określony typ zagnieżdżony, który ma taką samą nazwę jak jeden z członków klasy zewnętrzna, więc ten kod nie zostanie skompilowany. Albo enum, albo właściwość będą musiały być nazwane czymś innym. Również konflikt nazwy klasy i nazwy zmiennej powoduje, że jest to nieco bardziej skomplikowane.

Aby to odpowiedzi bardziej ogólny zrobić, jeśli masz to:

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

    public enum SomeEnum { 
     Hello, World 
    } 
} 

Wtedy ten kod przypisze wartość enum do nieruchomości:

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

Po wpisaniu klasy 2. Wyliczenie trybu nie pojawia się w IntelliSense, więc wydaje się, że NIE działa. Jak opisałem, chcę ustawić tryb na INSTANCJĘ, a nie przez classname.Mode. – Elisabeth

+0

@Lisa: To dlatego, że nazwałaś zmienną o tej samej nazwie co klasa. Symbole nakładają się, więc kompilator zakłada, że ​​odnosisz się do zmiennej. Zmień nazwę swojej zmiennej lub nazwę klasy. Zobacz mój dodatkowy kod przykładowy dla poprawnej składni, której będziesz używał po zmianie nazwy jednego z nich. – cdhowie

+0

@Elisabeth Miałem ten sam problem. Wyjaśnienie, które w końcu znalazłem naprawdę, jest takie proste: enum jest częścią klasy, a nie częścią instancji klasy. Jak już wspomniałeś powyżej, używanie właściwości jest najlepszym rozwiązaniem. – jibbs

16

Można zadeklarować enum poza klasą:

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

a następnie można dodać using MyNamespace; gdzie należy go stosować.

+0

OP powiedział * "Czy jest to jakoś możliwe bez użycia obszaru przestrzeni nazw?" * – cdhowie

+0

@cdhowie: Byłem zdezorientowany jakimś sformułowaniem w pytaniu, więc pomyślałem, że stara się uniknąć konieczności pełnego zakwalifikowania nazwy klasy . Twoja odpowiedź i moja w zasadzie w pełni pokazują, w jaki sposób można deklarować wyliczenia, więc tak czy inaczej na pytanie należy odpowiedzieć :-) –

+0

Widzę, tak, to możliwa interpretacja. Sformułowanie zdecydowanie nie jest jasne. :) – cdhowie

5

odpowiedź Aaron jest bardzo ładne, ale wierzę, że jest to znacznie lepszy sposób to zrobić:

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 
    } 
} 

Nie ma sensu na ten komplikuje. To proste zadanie.

Wszystkie najlepsze

Chris.

+2

Otrzymałem komunikat "interfejs nie może zadeklarować typów", gdy użyłem zaakceptowanego rozwiązania, jednak działało to całkiem nieźle! –

Powiązane problemy