2009-10-22 9 views
0

Y a-t-il un moyen de pointer un Enum vers un autre Enum? Voici les besoins et les détails:C# Enum pointant vers un autre Enum (refactoring)

Actuellement:

  • I have a deux classes publiques com.abcd.MyManager et com.abcd.data.MyObject.
  • La classe MyObject possède à peu près tout ce qui est privé sauf le type Types enum membre.
  • La classe MyManager utilise la classe MyObject
  • Remarque La classe MyObject réside dans un espace de noms distinct.
  • L'une des méthodes de MyManager ont après la signature:
    public void Init(string name, MyObject.Types type)
    {
    // does Init
    }

exigence Refactoriser:

  • Juste à cause de MyObject.Types utilisés dans la méthode Init et aussi vit dans un autre espace de noms. Les développeurs doivent inclure les deux espaces de noms dans leur code. J'aime déplacer l'énumération MyObject.Types vers la classe MyManager. quelque chose de semblable à ceci:
    public void Init(string name, MyManager.Types type)
    {
    // does Init
    }

Toutes les suggestions sur comment pourrais-je faire cela sans casser la structure actuelle? Merci.

+0

Votre question est comment le développeur peut-il utiliser l'Init de MyManager sans utiliser l'espace de nom de MyObject? –

Répondre

2

Vous pouvez avoir un enum utiliser les valeurs d'un autre, mais vous ne pouvez pas les rendre interchangeables (sans lancer).

public class MyManager 
{ 
    public enum Types 
    { 
     Type1 = com.abcd.data.MyObject.Types.Type1, 
     Type2 = com.abcd.data.MyObject.Types.Type2, 
     Type3 = com.abcd.data.MyObject.Types.Type3 
    } 
} 

Cela vous permettra de jeté entre les deux enum s et obtenir la même valeur pour les mêmes noms de membres, mais vous aurez encore à lancer.

0

Je ne vois pas pourquoi le déplacement de l'énumération casserait n'importe quoi. Vous devriez être en mesure de simplement déplacer l'énumération à com.abcd.Types, et assurez-vous que le fichier de code MyObject inclut une directive using pour l'espace de noms com.abcd. Si vous voulez vraiment avoir l'enum à l'intérieur MyManager, puis MyObject doit se référer à MyManager.Types au lieu de seulement Types.

Y at-il des problèmes spécifiques que vous rencontrez lorsque vous tentez le refactoring?

0

J'ai deux suggestions.

1) Déplacez l'énumération MyObject.Types vers un projet distinct auquel MyObject et MyManager font référence.

2) Créez une énumération dans le projet MyManager qui correspond à l'énumération dans le projet MyObject. Ensuite, vous pouvez avoir une sorte de méthode de cartographie:

public void Init(string name, MyManager.Types type) 
{ 
    MyObject.Types t = type.ToMyObjectType(); 
} 

internal static class Extensions 
{ 
    public static MyObject.Types ToMyObjectType(this MyManager.Types t) 
    { 
     //do mapping 
    } 
} 

Je ne suggère d'utiliser la deuxième approche, parce que si l'ENUM en MyObject ne change jamais, vous devez vous rappeler de mettre à jour ce code.