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 ?
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
Voilà
{
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);
}
}
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
Vous devez être identifié pour poster un commentaire.
| 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 |
Copyright © 2000-2012 - www.developpez.com