2010-12-14 68 views
10

Je sais que je peux mettre mon énumération dans la zone Espace de nommage d'une classe afin que tout le monde puisse y accéder étant dans le même espace de nommage.C#: Access Enum d'une autre classe

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

Ce que je veux est d'accéder à ce ENUM de

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

Est-ce possible en quelque sorte sans utiliser la zone d'espace de noms?

+0

Je ne vous ai vraiment pas compris ... vous pouvez accéder aux classes définies dans les classes uniquement à partir d'objets, comme vous le faites, quel est le problème? – Machinarius

+0

Pourquoi diable essayez-vous d'éviter d'utiliser le qualificatif d'espace de noms? En outre, 'La zone d'espace de noms d'une classe' n'est pas très claire. –

+1

À mon avis, vous devriez vraiment définir une énumération dans son propre fichier. De cette façon, vous n'auriez pas de classes imbriquées à référencer. – froeschli

Répondre

7

Si vous essayez de faire ce que est décrit ci-dessous il ne fonctionnera pas ...

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

Ce que vous pourriez faire cependant est ci-dessous, ce qui fonctionnera ...

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 J'ai édité la réponse pour être plus en ligne avec je pense que ce que vous essayez de faire ... sinon ... alors l'autre réponse est dans l'histoire ... :) –

+6

Je reçois l'interface ne peut pas déclarer les types lors de l'utilisation ce code –

+0

Moi aussi, en plus du commentaire d'Idan Shechter "Je reçois l'interface ne peut pas déclarer les types lors de l'utilisation de ce code". – fletchsod

4

Oui:

class2.Mode = class2.Mode.Selected 

Mais notez que vous ne pouvez pas avoir un type imbriqué défini qui a le même nom que l'une de la classe externe membres, de sorte que ce code ne compilera pas. Soit l'énumération, soit la propriété, devra être nommée autre chose. Le nom de votre classe et le nom de votre variable entrent également en conflit, ce qui rend la tâche un peu plus complexe.

Pour faire une réponse plus générique, si vous avez ceci:

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

    public enum SomeEnum { 
     Hello, World 
    } 
} 

Ensuite, ce code attribue une valeur ENUM à la propriété:

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

Lorsque je tape class2. le mode Enum n'apparaît pas dans Intellisense, donc il ne semble pas fonctionner. Comme je l'ai décrit, je veux mettre Mode sur une INSTANCE pas via classname.Mode. – Elisabeth

+0

@Lisa: C'est parce que vous avez nommé votre variable le même nom que la classe. Les symboles se chevauchent, de sorte que le compilateur suppose que vous faites référence à la variable. Changez le nom de votre variable, ou le nom de la classe. Voyez mon code d'exemple supplémentaire pour la syntaxe correcte que vous devrez utiliser après avoir renommé l'un d'entre eux. – cdhowie

+0

@Elisabeth J'ai eu le même problème. L'explication que j'ai finalement trouvée est vraiment simple: enum fait partie de la classe et ne fait pas partie d'une instance de classe. Comme vous l'avez déjà commenté ci-dessus, l'utilisation d'une propriété est la meilleure solution. – jibbs

16

Vous pouvez déclarer une ENUM en dehors d'une classe:

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

Et vous pouvez ajouter using MyNamespace; où il doit être utilisé.

+0

L'OP a dit * "Est-ce que c'est en quelque sorte possible sans utiliser l'espace de noms?" * – cdhowie

+0

@cdhowie: J'ai été troublé par une partie du libellé de la question, donc je pensais qu'elle essayait d'éviter de qualifier complètement le nom de la classe . Votre réponse et la mienne montrent essentiellement comment les enums peuvent être déclarés, donc d'une manière ou d'une autre, la question devrait être résolue :-) –

+0

Je vois, ouais c'est une interprétation possible. Le libellé n'est définitivement pas clair. :) – cdhowie

5

La réponse d'Aaron est très agréable, mais je crois qu'il ya une meilleure façon de le faire:

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

Aucun point sur ce qui complique cela. C'est une tâche simple.

Tous les meilleurs

Chris.

+2

Je reçois l'erreur "interface ne peut pas déclarer les types" lorsque j'ai utilisé la solution acceptée, mais cela a plutôt bien fonctionné! –