480 votes

Associant des énumérations avec des chaînes en c#

Je sais pas que ce qui suit n’est pas possible car il doit être un int

De ma base de données, j’obtiens un champ avec des codes incomplètes (OEM et de CMB). Je ne veux pas faire de ce champ dans un enum ou quelque chose de bien compréhensible. Car la cible est la lisibilité, la solution devrait être laconique.
Quelles autres options ai-je ?

518voto

Even Mien Points 10122

J’aime utiliser des propriétés d’une classe au lieu de méthodes, car ils ont l’air plus enum-type.

Voici un exemple pour un Logger :

Passez des valeurs de chaîne de type sécurisé comme un paramètre :

Utilisation :

221voto

Glennular Points 8324

Vous pouvez également utiliser le modèle d’extension :

Votre classe d’Extension

utilisation :

35voto

Arthur C Points 206

Vous pouvez le faire très facilement en fait. Utilisez le code suivant.

Puis lorsque vous voulez obtenir la valeur de chaîne de chaque élément enum il suffit d’utiliser la ligne de code suivante.

J’ai utilisé cette méthode avec succès dans le passé et j’ai aussi utilisé une classe constantes pour contenir des constantes de chaîne, les deux a assez bien fonctionnent, mais j’ai tendance à préférer ce.

32voto

casperOne Points 49736

Vous pouvez ajouter des attributs aux éléments de l'énumération et ensuite utiliser la réflexion pour obtenir les valeurs des attributs.

Vous devez utiliser le "champ" spécificateur pour appliquer les attributs, comme suit:

enum GroupTypes
{
    [field:Description("OEM")]
    TheGroup,

    [field:Description("CMB")]
    TheOtherGroup
}

Il vous faudra alors réfléchir sur les champs statiques du type de l'enum (dans ce cas GroupTypes) et obtenir l' DescriptionAttribute pour la valeur que vous recherchez à l'aide de la réflexion:

public static DescriptionAttribute GetEnumDescriptionAttribute<T>(
    this T value) where T : struct
{
    // The type of the enum, it will be reused.
    Type type = typeof(T);

    // If T is not an enum, get out.
    if (!type.IsEnum) 
        throw new InvalidOperationException(
            "The type parameter T must be an enum type.");

    // If the value isn't defined throw an exception.
    if (!Enum.IsDefined(type, value))
        throw new InvalidEnumArgumentException(
            "value", Convert.ToInt32(value), type);

    // Get the static field for the value.
    FieldInfo fi = type.GetField(value.ToString(), 
        BindingFlags.Static | BindingFlags.Public);

    // Get the description attribute, if there is one.
    return fi.GetCustomAttributes(typeof(DescriptionAttribute), true).
        Cast<DescriptionAttribute>().SingleOrDefault();
}

J'ai opté pour le retour de l' DescriptionAttribute - dessus, dans le cas où vous voulez être en mesure de déterminer si oui ou non l'attribut est encore appliquée.

16voto

Dave Van den Eynde Points 8199

Créez un deuxième enum, pour votre DB contenant les éléments suivants :

Maintenant, vous pouvez utiliser Enum.Parse pour récupérer la valeur correcte de la DBGroupTypes des cordes « OEM » et « CMB ». Vous pouvez ensuite convertir ceux en int et récupérer les valeurs correctes de l’énumération droite que vous souhaitez utiliser dans votre modèle.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X