2009-09-09 8 views
2

Dans mon projet, j'utilise énumérations exemple:nom enum avec plusieurs valeurs

public enum NcStepType { Start = 1, Stop = 3, Normal = 2 } 

Je lis des valeurs à partir d'une base de données, mais parfois il y a des valeurs 0 dans mon dossier, donc je veux un ENUM cela ressemble à

public enum NcStepType { Start = 1 OR 0, Stop = 3, Normal = 2 } 

est-ce possible (en C#)?

Répondre

2

Vous pouvez créer une méthode d'extension générique qui gère des valeurs inconnues:

public static T ToEnum<T>(this int value, T defaultValue) 
    { 
     if (Enum.IsDefined(typeof (T),value)) 
      return (T) (object) value; 
     else 
      return defaultValue; 
    } 

Ensuite, vous pouvez simplement appeler:

int value = ...; // value to be read 

NcStepType stepType = value.ToEnum(NcStepType.Start); 

// if value is defined in the enum, the corresponding enum value will be returned 
// if value is not found, the default is returned (NcStepType.Start) 
+0

Pour rendre la fonction plus explicite je l'appellerais ToEnumOrDefault() (comme déjà extensions de linq existantes) – Oliver

2

Non, fondamentalement. Vous devrez lui donner l'une des valeurs (probablement le 1), et interpréter l'autre (0) manuellement.

2

Non, ce n'est pas le cas et je ne sais pas comment cela fonctionnerait en pratique.

Ne pouvez-vous pas ajouter une logique qui correspond à 0 à 1 lors de la lecture de la base de données?

+0

c'est ce que je fais en ce moment, mais ce serait plus facile si je n'ai pas besoin de vérifier si c'est une valeur valide dans ma liste enum. Je travaille avec un service wcf et quand j'essaye d'ajouter la valeur 0 à mon énumération, il me donne toujours une erreur introuvable –

1

Non, en C#, une énumération ne peut avoir qu'une seule valeur.

Rien ne dit que la valeur dans la base de données doit correspondre directement à votre valeur enum. Vous pouvez très facilement attribuer une valeur de Start chaque fois que vous lisez 0 ou 1 à partir de la base de données.

0

Aucune solution en C#. Mais vous pouvez prendre 2 étapes:

1. Régler la valeur par défaut de votre champ DB à 1.
2. Mise à jour tous les existants 0 à 1.

2

Normalement, je DEFINE dans ce cas, le 0 comme suit :

public enum NcStepType 
{ 
    NotDefined = 0, 
    Start = 1, 
    Normal = 2, 
    Stop = 3, 
} 

Et quelque part dans le code que je ferais un:

if(Step == NcStepType.NotDefined) 
{ 
    Step = NcStepType.Start; 
} 

Cela rend la un code lisible et tout le monde sait ce qui se passe ... (si tout va bien)

0

Comme autant que je sache, vous pouvez écrire ceci

enum NcStepType { Start = 0, Start = 1, Stop = 3, Normal = 2 } 

Le seul problème est plus tard là d ne pas dire quel Start a été utilisé pour l'initialisation des variables (il semblerait toujours que c'était le).

+0

Je prendrais le conseil d'Oliver. – zzandy

Questions connexes