Enum value to ssortingng

Est-ce que quelqu’un sait comment obtenir des valeurs enum en chaîne?

Exemple:

private static void PullReviews(ssortingng action, HttpContext context) { switch (action) { case ProductReviewType.Good.ToSsortingng(): PullGoodReviews(context); break; case ProductReviewType.Bad.ToSsortingng(): PullBadReviews(context); break; } } 

Modifier:

Lorsque vous essayez d’utiliser ToSsortingng (); le compilateur se plaint parce que l’instruction case attend une constante. Je sais aussi que ToSsortingng () est effacé avec une ligne dans intellisense

Oui, vous pouvez utiliser .ToSsortingng() pour obtenir une valeur de chaîne pour une énumération, mais vous ne pouvez pas utiliser .ToSsortingng() dans une instruction switch. Les instructions de commutateur nécessitent des expressions constantes, et .ToSsortingng () n’est pas évalué avant l’exécution, le compilateur renvoie donc une erreur.

Pour obtenir le comportement souhaité, avec un peu de changement dans l’approche, vous pouvez utiliser enum.Parse() pour convertir la chaîne d’ action en une valeur enum et activer cette valeur enum à la place. À partir de .NET 4, vous pouvez utiliser Enum.TryParse() et effectuer la vérification et la gestion des erreurs dès le départ, plutôt que dans le corps du commutateur.

Si c’était moi, j’parsingrais la chaîne en fonction d’une valeur enum et l’activerais, plutôt que d’activer la chaîne.

 private static void PullReviews(ssortingng action, HttpContext context) { ProductReviewType review; //there is an optional boolean flag to specify ignore case if(!Enum.TryParse(action,out review)) { //throw bad enum parse } switch (review) { case ProductReviewType.Good: PullGoodReviews(context); break; case ProductReviewType.Bad: PullBadReviews(context); break; default: //throw unhandled enum type } } 

Vous allez à ce sujet en arrière. N’essayez pas d’utiliser des chaînes dynamics comme étiquettes de casse (vous ne pouvez pas), mais parsingz la chaîne dans une valeur enum:

 private static void PullReviews(ssortingng action, HttpContext context) { // Enum.Parse() may throw if input is invalid, consider TryParse() in .NET 4 ProductReviewType actionType = (ProductReviewType)Enum.Parse(typeof(ProductReviewType), action); switch (actionType) { case ProductReviewType.Good: PullGoodReviews(context); break; case ProductReviewType.Bad: PullBadReviews(context); break; default: // consider a default case for other possible values... throw new ArgumentException("action"); } } 

EDIT: En principe, vous pouvez simplement comparer les chaînes codées en dur dans vos instructions switch (voir ci-dessous), mais il s’agit de l’approche la moins recommandée, car elle casserait simplement lorsque vous modifieriez les valeurs transmises à la méthode ou à la définition. de l’énum. J’ajoute ceci car cela vaut la peine de savoir que les chaînes peuvent être utilisées comme étiquettes de casse, pour autant qu’elles soient littérales au moment de la compilation . Les valeurs dynamics ne peuvent pas être utilisées comme cas, car le compilateur ne les connaît pas.

 // DON'T DO THIS...PLEASE, FOR YOUR OWN SAKE... switch (action) { case "Good": PullGoodReviews(context); break; case "Bad": PullBadReviews(context); break; } 
 public enum Color { Red } var color = Color.Red; var colorName = Enum.GetName(color.GetType(), color); // Red 

Edit: Ou peut-être vous voulez ..

 Enum.Parse(typeof(Color), "Red", true /*ignorecase*/); // Color.Red 

Il n’y a pas de TryParse pour Enum, donc si vous vous attendez à des erreurs, vous devez utiliser try / catch:

 try { Enum.Parse(typeof(Color), "Red", true /*ignorecase*/); } catch( ArgumentException ) { // no enum found } 

Ce code va fonctionner.

 private enum ProductReviewType{good, bad}; private static void PullReviews(ssortingng action) { ssortingng goodAction = Enum.GetName(typeof(ProductReviewType), ProductReviewType.good); ssortingng badAction = Enum.GetName(typeof(ProductReviewType), ProductReviewType.bad); if (action == goodAction) { PullGoodReviews(); } else if (action == badAction) { PullBadReviews(); } } public static void PullGoodReviews() { Console.WriteLine("GOOD Review!"); } public static void PullBadReviews() { Console.WriteLine("BAD Review..."); } 

Puisque la chaîne analysée n’est pas constante, elle ne peut pas être utilisée par l’instruction Switch. Compilé dans VS2005

Vous pouvez utiliser une autre variable temporaire pour enregistrer la classe Type of enum. Cela peut améliorer les performances.

Je vous conseillerais de procéder autrement – essayez d’utiliser les valeurs enum réelles autant que possible (en convertissant la chaîne en une valeur enum dès que vous le pourrez ), plutôt que de passer des chaînes autour de votre application:

 ProductReviewType actionType = (ProductReviewType)Enum.Parse(typeof(ProductReviewType), val); // You might want to add some error handling here. PullReviews(actionType); private static void PullReviews(ProductReviewType action, HttpContext context) { switch (action) { case ProductReviewType.Good: PullGoodReviews(context); break; case ProductReviewType.Bad: PullBadReviews(context); break; } } 

Notez que j’ai modifié la signature de votre méthode pour accepter un argument ProductReviewType . cela indique clairement ce dont votre méthode a réellement besoin pour mettre en œuvre sa logique et correspond à mon idée initiale selon laquelle vous devez essayer autant que possible de ne pas passer de chaînes.

C’est juste pour le plaisir, mais si vous utilisiez un dictionnaire de delegates? Je me rends compte que votre approche est complètement différente, mais l’ajout de dictionnaire pourrait en réalité mieux fonctionner pour ce que vous essayez d’accomplir, d’autant plus qu’il offre un haut degré de modularité, par opposition à une construction mondo-switch (bien que je doive admettez, votre enum n’a que 2 membres, c’est donc un problème théorique). En tout cas, je voulais juste émettre une manière différente de faire les choses …

L’approche basée sur les dictionnaires ressemblerait à ceci:

 namespace ConsoleApplication1 { public enum ProductReviewType { Good, Bad } public static class SsortingngToEnumHelper { public static ProductReviewType ToProductReviewType(this ssortingng target) { // just let the framework throw an exception if the parse doesn't work return (ProductReviewType)Enum.Parse( typeof(ProductReviewType), target); } } class Program { delegate void ReviewHandler(HttpContext context); static readonly Dictionary pullReviewOperations = new Dictionary() { {ProductReviewType.Good, new ReviewHandler(PullGoodReviews)}, {ProductReviewType.Bad, new ReviewHandler(PullBadReviews)} }; private static void PullGoodReviews(HttpContext context) { // actual logic goes here... Console.WriteLine("Good"); } private static void PullBadReviews(HttpContext context) { // actual logic goes here... Console.WriteLine("Bad"); } private static void PullReviews(ssortingng action, HttpContext context) { pullReviewOperations[action.ToProductReviewType()](context); } static void Main(ssortingng[] args) { ssortingng s = "Good"; pullReviewOperations[s.ToProductReviewType()](null); s = "Bad"; pullReviewOperations[s.ToProductReviewType()](null); // pause program execution to review results... Console.WriteLine("Press enter to exit"); Console.ReadLine(); } } }