J'ai ce code Enum :
enum Duration { Day, Week, Month };
Puis-je ajouter une méthode d'extension pour cette Enum ?
J'ai ce code Enum :
enum Duration { Day, Week, Month };
Puis-je ajouter une méthode d'extension pour cette Enum ?
Selon cette site :
Les méthodes d'extension permettent d'écrire des méthodes pour des classes existantes d'une manière que d'autres personnes de votre équipe pourraient découvrir et utiliser. Étant donné que les enums sont des classes comme les autres, il ne devrait pas être trop surprenant que vous puissiez les étendre, par exemple :
enum Duration { Day, Week, Month };
static class DurationExtensions
{
public static DateTime From(this Duration duration, DateTime dateTime)
{
switch (duration)
{
case Day: return dateTime.AddDays(1);
case Week: return dateTime.AddDays(7);
case Month: return dateTime.AddMonths(1);
default: throw new ArgumentOutOfRangeException("duration");
}
}
}
Je pense que les enums ne sont pas le meilleur choix en général mais au moins cela vous permet de centraliser une partie de la gestion des switch/if et de les abstraire un peu jusqu'à ce que vous puissiez faire quelque chose de mieux. N'oubliez pas de vérifier que les valeurs sont comprises dans l'intervalle.
Vous pouvez lire la suite aquí chez Microsft MSDN.
Vous pouvez également ajouter une méthode d'extension au type Enum plutôt qu'une instance de l'Enum :
/// <summary> Enum Extension Methods </summary>
/// <typeparam name="T"> type of Enum </typeparam>
public class Enum<T> where T : struct, IConvertible
{
public static int Count
{
get
{
if (!typeof(T).IsEnum)
throw new ArgumentException("T must be an enumerated type");
return Enum.GetNames(typeof(T)).Length;
}
}
}
Vous pouvez invoquer la méthode d'extension ci-dessus en faisant :
var result = Enum<Duration>.Count;
Ce n'est pas une véritable méthode d'extension. Elle ne fonctionne que parce que Enum<> est un type différent de System.Enum.
Bien sûr, vous pouvez, disons par exemple, que vous voulez utiliser la fonction DescriptionAttribue
sur votre enum
valeurs :
using System.ComponentModel;
public enum Duration
{
[Description("Eight hours")]
Day,
[Description("Five days")]
Week,
[Description("Twenty-one days")]
Month
}
Maintenant, vous voulez être en mesure de faire quelque chose comme :
Duration duration = Duration.Week;
var description = duration.GetDescription(); // will return "Five days"
Votre méthode d'extension GetDescription()
peut s'écrire comme suit :
using System.ComponentModel;
using System.Reflection;
public static string GetDescription(this Enum value)
{
FieldInfo fieldInfo = value.GetType().GetField(value.ToString());
if (fieldInfo == null) return null;
var attribute = (DescriptionAttribute)fieldInfo.GetCustomAttribute(typeof(DescriptionAttribute));
return attribute.Description;
}
Toutes les réponses sont excellentes, mais elles parlent d'ajouter une méthode d'extension à un type spécifique d'énumération.
Que faire si vous voulez ajouter une méthode à tous les enums pour retourner un int de la valeur actuelle au lieu d'un casting explicite ?
public static class EnumExtensions
{
public static int ToInt<T>(this T soure) where T : IConvertible//enum
{
if (!typeof(T).IsEnum)
throw new ArgumentException("T must be an enumerated type");
return (int) (IConvertible) soure;
}
//ShawnFeatherly funtion (above answer) but as extention method
public static int Count<T>(this T soure) where T : IConvertible//enum
{
if (!typeof(T).IsEnum)
throw new ArgumentException("T must be an enumerated type");
return Enum.GetNames(typeof(T)).Length;
}
}
L'astuce derrière IConvertible
est sa hiérarchie d'héritage, voir MDSN
Merci à ShawnFeatherly pour sa réponse
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.