novembre
2008
J’avais besoin de convertir des enums en autre enums dont le contenu est identique.
{
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 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 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
3 Commentaires + Ajouter un commentaire
Commentaires récents
- [Tests] Arrange Act Assert, une traduction ? dans
- [UnitTest][C#] Tester une méthode privée dans
- Récupérer une valeur d’un contrôle depuis une autre Form / inclusions croisées et déclaration anticipée dans
- Tutoriel : Utiliser la ListBox et l’Isolated Storage dans vos applications Windows Phone 7 avec Silverlight dans
- Tutoriel : Utiliser la ListBox et l’Isolated Storage dans vos applications Windows Phone 7 avec Silverlight dans
Archives
- janvier 2013
- avril 2012
- janvier 2012
- juin 2011
- janvier 2011
- décembre 2010
- novembre 2010
- septembre 2010
- juin 2010
- mars 2010
- février 2010
- janvier 2010
- décembre 2009
- novembre 2009
- octobre 2009
- septembre 2009
- août 2009
- juillet 2009
- mai 2009
- avril 2009
- mars 2009
- janvier 2009
- décembre 2008
- novembre 2008
- octobre 2008
- septembre 2008
- août 2008
- juillet 2008
- juin 2008
- mai 2008
- avril 2008
- mars 2008
- février 2008
- janvier 2008
- décembre 2007
- novembre 2007
- octobre 2007
- septembre 2007
- août 2007
- juillet 2007
- juin 2007
- mai 2007
pas de quoi
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 !
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 )