Article complet: [C#] Convertir un enum en un autre

26/11/2008

Permalink 21:00:00, Catégories: C#, Récapitulatif .NET, Récapitulatif, 490 mots   French (FR) , nico-pyright(c)

[.NET] [C#] Convertir un enum en un autre

J'avais besoin de convertir des enums en autre enums dont le contenu est identique.

public enum Enum1 

  ABC, 
  DEF, 
  GHI 

 
public enum Enum2 

  ABC, 
  DEF, 
  GHI 

 
Enum1 enum1 = Enum1.DEF; 
Enum2 enum2 = ??enum1??; // on met quoi la ?? 

Le premier reflexe : un cast me direz vous, sauf que cela force à être dépendant de la valeur de l'enum (qui ici est 0,1,2). Que faire si on insère une valeur au milieu d'une autre ? Que faire si on a autre chose que des entiers ?

[Suite:]

Une solution que j'ai implémenté : Utiliser Enum.GetValues J'ai donc créé une méthode générique qui permet de faire cette conversion. Notez l'emploi de Linq pour faire la recherche entre les valeurs de l'enum : public class EnumMismatchException<T> : ApplicationException 

  public EnumMismatchException(T value, Type u) 
  : base("Impossible de convertir " + value + "( " + value.GetType() +") en " + u) 
  { } 

 
public enum Enum1 

  ABC, 
  DEF, 
  GHI 

 
public enum Enum2 

  ABC, 
  DEF, 
  GHI 

 
class Program 

  public static T EnumToEnum<U, T>(U value) 
  { 
  var result = Enum.GetValues(typeof(T)).OfType<T>(). 
  Where(v => string.Compare(value.ToString(), v.ToString(), StringComparison.InvariantCultureIgnoreCase) == 0); 
  if (result.Count() == 0) 
  throw new EnumMismatchException<U>(value, typeof(T)); 
  return result.First(); 
  } 
 
  static void Main() 
  { 
  const Enum1 enum1 = Enum1.DEF; 
  Enum2 enum2 = EnumToEnum<Enum1, Enum2>(enum1); 
 
  Console.WriteLine(enum2); 
  } 
}
Voilà

Suite à une remarque de Vincent Lainé, on peut faire beaucoup plus simple. En utilisant Enum.Parse. Ce qui nous donne le code suivant :

public class EnumMismatchException<T> : ApplicationException 

  public EnumMismatchException(T value, Type u) 
  : base("Impossible de convertir " + value + "( " + value.GetType() +") en " + u) 
  { } 

 
public enum Enum1 

  ABC, 
  DEF, 
  GHI 

 
public enum Enum2 

  ABC, 
  DEF, 
  GHI 

 
class Program 

  public static T EnumToEnum<U, T>(U value) 
  { 
  try 
  { 
  return (T)Enum.Parse(typeof(T), value.ToString()); 
  } 
  catch (Exception ex) 
  { 
  throw new EnumMismatchException<U>(value, typeof(T)); 
  } 
  } 
 
  static void Main(string[] args) 
  { 
  const Enum1 enum1 = Enum1.DEF; 
  Enum2 enum2 = EnumToEnum<Enum1, Enum2>(enum1); 
  } 

 

Un peu plus simple, et pas de Linq ...

Merci à lui

Social Bookmarking:

                                     

Commentaires, Pingbacks:

Connectez-vous pour vous abonner à cet article:

Flux de commentaires pour cet article : Atom 1.0  RSS 2.0
Commentaire de: Vincent Lainé [Membre] · http://vincentlaine.developpez.com/
Euh je vais peut etre dire une bétise mais ça n'aurait pas été plus simple de faire :

Enum1 a = Enum.DEF;

Enum2 b = (Enum2)Enum.Parse(a.ToString());

Du moment que les deux enums ont exactement la même représentation litérale ça fonctionne. (D'ailleurs tu te bases également sur cette représentation :) )
Permalien 26/11/2008 @ 23:19
Commentaire de: nico-pyright(c) [Membre]
ah oué ...
et c'est pas un peu trop simple ca ? :aie:

Bon, donc, pourquoi faire compliqué quand on peut faire simple ... je vais mettre à jour le post.

Merci Vincent !
Permalien 27/11/2008 @ 09:19
Commentaire de: Vincent Lainé [Membre] · http://vincentlaine.developpez.com/
:D pas de quoi ;)
Permalien 27/11/2008 @ 09:56

Vous devez être identifié pour poster un commentaire.

Liste des blogs

Blog de Nico-pyright(c)

Catégories


Rechercher

<  Janvier 2012  >
Lun Mar Mer Jeu Ven Sam Dim
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31          

Syndiquez ce blog XML

Articles :

Commentaires :

 
 
 
 
Partenaires

Hébergement Web