2010-12-21 2 views
14

Salut J'ai cette ENUM actuellementaffecter plusieurs valeurs à enum éléments

[Serializable] 
public enum Country 
{ 
    US  = 1, 
    Canada = 2, 
} 

Quand je reçois habituellement l'entier de la base de données je convertir au ENUM en utilisant

(Country) Convert.ToInt32("1") 

J'ai maintenant 2 sous régions des États-Unis et du Canada, 1 & 2 pour les États-Unis et 3 & 4 pour le Canada. Donc, quand je le fais

(Country) Convert.ToInt32("1") ou (Country) Convert.ToInt32("2") je devrais obtenir l'enum à US. et pour 3 & 4 Canada. Comment puis-je l'implémenter?

[Serializable] 
public enum Country 
{ 
    US  = 1,2 
    Canada = 3,4 
} 

Quelque chose comme ceci. Ce n'est probablement pas juste mais juste pour vous donner une idée.

Répondre

3

Ah je viens d'utiliser une fonction au lieu de typer directement. Bien plus facile que de mettre en œuvre quelque chose de complètement différent. J'ai déjà beaucoup de code en cours d'exécution, donc je ne peux pas vraiment le changer mais voici ce que j'ai fait.

public Country GetCountryByTaxID(int taxID) 
     { 
      if (taxID == 3 || taxID == 4) 
      { 
       return Country.USA; 
      } 
      else 
      { 
       return Country.Canada; 
      } 
     } 
9

Vous devez faire quelque chose comme ceci:

class Region 
{ 
    static readonly RegionMap = new Dictionary<int,string> 
    { 
     { 1, "US" }, 
     { 2, "US" }, 
     { 3, "Canada" } 
     { 4, "Canada" } 
    } 

    public static string GetRegion(int code) 
    { 
     string name; 
     if (!RegionMap.TryGetValue(code, out name) 
     { 
      // Error handling here 
     } 
     return name; 
    } 
} 

Recherchez ensuite la chaîne en fonction de la valeur de la base de données:

string region = Region.GetRegion(dbVal); 
+0

Je l'ai trouvé à la recherche d'autre chose. C'est la réponse la plus saine pour moi. Bien sûr, cette question a été posée il y a 5 ½ ans! – MarkMYoung

8

Ce n'est pas possible. Vous devrez alors utiliser des valeurs séparées. Si les noms sont les mêmes, ie. Vous pouvez le faire: Countries = Country.US | Country.Northern Si ce n'est pas le cas, vous devez trouver un autre moyen, une autre propriété ou, mieux encore, une classe Location.

5

Peut-être que quelque chose comme ça?

static Country ConvertRegionToCountry(string region) 
{ 
    switch (region) 
    { 
     case "1": 
     case "2": 
      return Country.US; 

     case "3": 
     case "4": 
      return Country.Canada; 
    } 
} 
13

Un enum peut ne pas être la bonne construction pour modéliser ce genre de problème.

Je suggère de créer une classe pour représenter les informations sur les pays et de fournir des méthodes de conversion vers et depuis les représentations numériques. Avec des problèmes comme celui-ci, vous devez également décider quelle valeur de codage vous utiliserez lors de la conversion d'une occurrence Country sélectionnée en valeur numérique.

Le modèle d'objet Enum peut être le point de départ utile pour modéliser ce genre de situation:

public sealed class Country 
{ 
    // initialize appropriately in the constructor... 
    private readonly int[] m_Values; 
    private readonly string m_Name; 

    // make the constructor private so that only this class can set up instances 
    private Country(string name, int[] codes) { ... } 

    public static Country US = new Country("United States", new[]{ 1,2 }); 
    public static Country Canada = new Country("Canada", new[] {3,4}); 

    public static Country FromCode(int code) { ... } 
    public override string ToString() { return m_Name; } 
    // ... etc... 
} 

Sur la base de votre exemple, vous devriez également considérer si vous avez besoin de modéliser les sous-régions pays de première classe entités, plutôt que de simplement les replier dans les détails de mise en œuvre de votre énumération de pays. Que vous deviez le faire ou non dépend de vos besoins et de vos cas d'utilisation, vous seul pouvez prendre une décision appropriée à ce sujet.

+0

Merci pour l'idée, je l'implémente dans une autre situation dans le même projet. Changer l'existant est vraiment douloureux, donc j'ai bloqué la solution rapide. Mais c'est beaucoup mieux. – tHeSiD

0

Ce coutures comme un problème de jeu pour moi où 1 & 2 sont en nous et ensemble 3 & 4 sont dans l'ensemble du Canada.Il y a un certain code sur qui je pense mieux modélise le problème.

3
public Country GetCountry(int a) 
     { 
      if (a == 1 || a == 2) 
      { 
       return Country.USA; 
      } 
      else if (a == 4|| a == 3) 
      { 
       return Country.Canada; 
      } 
     } 
0

Suite à la réponse de DTB (et les if équivalents suggestions), je viens mis en œuvre une version 'substituée' de System.Convert dans l'espace de nom de mon application:

public static class Convert 
{ 
    public static object ChangeType 
     (object value, Type conversionType, IFormatProvider provider) 
    { 
     int country; 
     if (conversionType == typeof(Country) 
      && int.TryParse(value.ToString(), out country)) 
     { 
      switch (country) 
      { 
       case 1: 
       case 2: 
        return Country.US; 
       case 3: 
       case 4: 
        return Country.Canada; 
      } 
     } 

     // For most cases, including any country unmatched above... 
     return System.Convert.ChangeType(value, conversionType, provider); 
    } 
} 

méthodes originales de la classe mscorlib.dll Convert doit maintenant être préfixé avec "System." bien sûr, donc des améliorations seraient les bienvenues!

Questions connexes