2010-05-18 5 views
1

J'ai le code qui reflète ENUM l'option (DictionaryType) à Guid de façon très straight-forwardC# Réflexion Enum Option à valeur constante

if (dictionaryType == DictionaryType.RegionType) 
    return Consts.DictionaryTypeId.RegionType; 

if (dictionaryType == DictionaryType.Nationality) 
    return Consts.DictionaryTypeId.Nationality; 

S'il vous plaît, me suggérer la meilleure façon de refléter l'option Enum à readonly statique valeur guid.

Nous vous remercions à l'avance

Edité un peu plus tard: Je ne peux pas attribuer tous les attributs d'énumération des options, « cos énumération est déclarée dans l'assemblage du modèle de données et énumérations ne doit pas être associé à la mise en œuvre (GUIDS, tableaux ...)

Répondre

1

En plus de la réponse de Jon, vous pouvez fournir les Guids comme des champs dans une classe séparée, où les champs ont le même nom que leur ENUM correspondant valeur.

Ceci peut être utilisé pour remplir un dictionnaire pour la recherche rapide plus tard:

using System; 
using System.Collections.Generic; 

namespace SO2856896 
{ 
    enum DictionaryType 
    { 
     RegionType, 
     Nationality 
    } 

    class Consts 
    { 
     public class DictionaryTypeId 
     { 
      public static Guid RegionType = new Guid("21EC2020-3AEA-1069-A2DD-08002B30309D"); 
      public static Guid Nationality = new Guid("21EC2020-3AEA-1069-A2DD-08002B30309E"); 
     } 
    } 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      Dictionary<DictionaryType, Guid> table = new Dictionary<DictionaryType, Guid>(); 

      Type idType = typeof(Consts.DictionaryTypeId); 
      foreach (DictionaryType dicType in Enum.GetValues(
       typeof(DictionaryType))) 
      { 
       System.Reflection.FieldInfo field = idType 
        .GetField(dicType.ToString(), 
         System.Reflection.BindingFlags.Static 
         | System.Reflection.BindingFlags.Public); 
       Guid guid = (Guid)field.GetValue(null); 
       table[dicType] = guid; 
      } 

      foreach (DictionaryType dicType in Enum.GetValues(
       typeof(DictionaryType))) 
      { 
       Console.Out.WriteLine(dicType + ": " + table[dicType]); 
      } 
     } 
    } 
} 

Sorties:

RegionType: 21ec2020-3aea-1069-a2dd-08002b30309d 
Nationality: 21ec2020-3aea-1069-a2dd-08002b30309e 

Je ne suis pas tout à fait sûr de ce que je me choisir, mais peut-être une combinaison de La réponse de Jon, un dictionnaire pour chercher les guids et la réflexion comme ci-dessus pour le peupler.

+0

Oui, l'attribut Id est une bonne idée, mais je ne peux pas l'assigner aux options d'énumération :( L'énumération est dans la bibliothèque Data Model et ne doit pas être combinée avec l'implémentation (Guids) –

+0

Code modifié pour refléter la classe séparée –

+0

Merci votre temps et vos efforts! –

1

quelques options simples:

  • Une instruction switch
  • A Dictionary<DictionaryType, Guid> (qui pourrait être peuplé par réflexion si vous vouliez vraiment)
+0

Quel code préféreriez-vous: changer avec plus de 15 cas de réflexion? –

+0

@Andrew: Je ne suis pas sûr, pour être honnête ... probablement la manière de Lasse de décorer l'enum elle-même, à moins que vous ayez besoin que les GUID soient disponibles ailleurs. –

Questions connexes