47 votes

Conversion chaîne en énumération en C #

J'ai une zone de liste déroulante où j'affiche des entrées comme:

 Equals
Not Equals 
Less Than
Greater Than
 

Notez que ces chaînes contiennent des espaces. J'ai une énumération définie qui correspond à ces entrées comme:

 enum Operation{Equals, Not_Equals, Less_Than, Greater_Than};
 

Puisque l'espace n'est pas autorisé, j'ai utilisé le caractère _.

Maintenant, existe-t-il un moyen de convertir automatiquement une chaîne donnée en un élément enum sans écrire une boucle ou un ensemble de conditions if mon auto en C #?

86voto

Mehrdad Afshari Points 204872

Je suggère de construire un Dictionary<string, Operation> pour mapper des noms conviviaux sur des énumérations constantes et utiliser des conventions de dénomination normales dans les éléments eux-mêmes.

 enum Operation{ Equals, NotEquals, LessThan, GreaterThan };

var dict = new Dictionary<string, Operation> {
    { "Equals", Operation.Equals },
    { "Not Equals", Operation.NotEquals },
    { "Less Than", Operation.LessThan },
    { "Greater Than", Operation.GreaterThan }
};

var op = dict[str];
 

Alternativement, si vous voulez vous en tenir à votre méthode actuelle, vous pouvez le faire (ce que je recommande de ne pas faire):

 var op = (Operation)Enum.Parse(typeof(Operation), str.Replace(' ', '_'));
 

22voto

AdaTheDev Points 53358
 Operation enumVal = (Operation)Enum.Parse(typeof(Operation), "Equals")
 

Pour "Pas égal", vous devez remplacer les espaces par des traits de soulignement dans la déclaration ci-dessus

19voto

Richard Szalay Points 42486

Soit créer un dédié mappeur à l'aide d'un dictionnaire (par Mehrdad de réponse) ou de mettre en œuvre un TypeConverter.

Votre personnalisé TypeConverter pourrait remplacer " " -> "_" (et vice versa), ou il pourrait refléter l'énumération et l'utilisation d'un attribut pour la détermination de l'affichage du texte de l'élément.

enum Operation
{
    [DisplayName("Equals")]
    Equals, 

    [DisplayName("Not Equals")]
    Not_Equals, 

    [DisplayName("Less Than")]
    Less_Than, 

    [DisplayName("Greater Than")]
    Greater_Than
};

public class OperationTypeConverter : TypeConverter
{
    private static Dictionary<string, Operation> operationMap;

    static OperationTypeConverter()
    {
        BindingFlags bindingFlags = BindingFlags.Static | BindingFlags.GetField
            | BindingFlags.Public;

        operationMap = enumType.GetFields(bindingFlags).ToDictionary(
            c => GetDisplayName(c)
            );
    }

    private static string GetDisplayName(FieldInfo field, Type enumType)
    {
        DisplayNameAttribute attr = (DisplayNameAttribute)Attribute.GetCustomAttribute(typeof(DisplayNameAttribute));

        return (attr != null) ? attr.DisplayName : field.Name;
    }

    public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
    {
        string stringValue = value as string;

        if (stringValue != null)
        {
            Operation operation;
            if (operationMap.TryGetValue(stringValue, out operation))
            {
                return operation;
            }
            else
            {
                throw new ArgumentException("Cannot convert '" + stringValue + "' to Operation");
            }
        }
    }
}

Cette mise en œuvre pourrait être améliorée de plusieurs façons:

  • Le rendre générique
  • Mettre En Œuvre ConvertTo
  • Soutien FlagsAttribute

9voto

Samuel Carrijo Points 9056

Vous pouvez utiliser la méthode Parse:

  Operarion operation = (Operation)Enum.Parse(typeof(Operation), "Not_Equals");
 

Quelques exemples ici

1voto

ablmf Points 1614

Pourquoi utiliser une autre méthode: convertir l'énumération en chaîne?

Générez simplement les éléments de votre combo à partir de votre énumération.

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