2010-12-14 31 views
10

Sé que puedo poner mi enumeración en el área de espacio de nombres de una clase para que todos puedan acceder a ella estando en el mismo espacio de nombres.C#: Acceso a Enum desde otra clase

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

Lo que yo quiero es acceder a esta enumeración de

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

¿Es esto de alguna manera posible sin el uso de área de espacio de nombres?

+0

Realmente no te entendí allí ... puedes acceder a las clases definidas dentro de las clases solo desde los objetos, tal como lo haces, ¿cuál es el problema? – Machinarius

+0

¿Por qué estás tratando de evitar el uso del calificador del espacio de nombres? Además, 'El área de espacio de nombres de una clase' no es muy clara. –

+1

En mi opinión, realmente debería definir una enumeración en su propio archivo. De esa forma, no habría anidado las clases para hacer referencia. – froeschli

Respuesta

7

Si usted está tratando de hacer lo se describe a continuación no funcionará ...

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

Lo que podría hacer sin embargo está debajo, que funcionará ...

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 He editado la respuesta para estar más en línea con Creo que lo que estás tratando de hacer ... si no ... entonces la otra respuesta está en la historia ... :) –

+6

Me sale la interfaz no puede declarar los tipos cuando se usa este código –

+0

Yo también, además del comentario de Idan Shechter "Me sale la interfaz no puedo declarar tipos cuando uso este código". – fletchsod

4

Sí:

class2.Mode = class2.Mode.Selected 

Pero tenga en cuenta que no se puede tener un tipo anidado definido que tiene el mismo nombre que uno de los miembros de la clase externa, por lo que este código no se compilará. O la enum o la propiedad necesitarán ser nombradas de otra manera. Tu nombre de clase y nombre de variable también entran en conflicto, lo que hace que este sea un poco más complejo.

Para que esto sea una respuesta más genérica, si usted tiene esto:

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

    public enum SomeEnum { 
     Hello, World 
    } 
} 

A continuación, este código le asignará un valor de enumeración a la propiedad:

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

Cuando escribo class2. el Modo enum no aparece en Intellisense, por lo que parece que NO funciona. Como lo describí, quiero configurar Mode en un INSTANCE no vía classname.Mode. – Elisabeth

+0

@Lisa: Eso se debe a que ha nombrado a su variable el mismo nombre que la clase. Los símbolos se superponen, por lo que el compilador supone que se está refiriendo a la variable. Cambia el nombre de tu variable, o el nombre de la clase. Vea mi código de ejemplo adicional para la sintaxis adecuada que deberá usar después de renombrar uno de ellos. – cdhowie

+0

@Elisabeth Tuve el mismo problema. La explicación que finalmente encontré realmente es así de simple: enum es parte de la clase, no parte de una instancia de clase. Como ya ha comentado anteriormente, usar una propiedad es la mejor solución. – jibbs

16

Se puede declarar una enumeración fuera de una clase:

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

Y a continuación, puede agregar using MyNamespace; donde tiene que ser utilizado.

+0

OP dijo * "¿Es esto posible de alguna manera sin usar el área de espacio de nombres?" * – cdhowie

+0

@cdhowie: Estaba confundido por algunas de las palabras en la pregunta, así que pensé que estaba tratando de evitar la necesidad de calificar completamente el nombre de clase . Su respuesta y la mía básicamente muestran completamente cómo se pueden declarar las enumeraciones, por lo que de una manera u otra la pregunta debe ser respondida :-) –

+0

Veo, sí, esa es una posible interpretación. La redacción definitivamente no es clara. :) – cdhowie

5

respuesta de Aaron es muy bonito, pero creo que hay una mejor manera de hacer esto:

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

No existe ningún punto más de lo que complica esto. Es una tarea simple.

Todo lo mejor

Chris.

+2

Aparece el error "interfaz no puede declarar tipos" cuando utilicé la solución aceptada, ¡pero funcionó bastante bien! –

Cuestiones relacionadas