« Enum » : différence entre les versions
De Banane Atomic
Aller à la navigationAller à la recherche
(→Flags) |
(→string) |
||
(12 versions intermédiaires par le même utilisateur non affichées) | |||
Ligne 2 : | Ligne 2 : | ||
= Bases = | = Bases = | ||
<kode lang=csharp> | <kode lang=csharp> | ||
enum MyEnum { Un, Deux } | enum MyEnum { Un = 1, Deux = 2 } | ||
// Compter le nombre d’élément d’une énumération. | // Compter le nombre d’élément d’une énumération. | ||
int count = Enum.GetValues(typeof(MyEnum)).Length; | int count = Enum.GetValues(typeof(MyEnum)).Length; | ||
// | // Retrieves the name of the constant that has the specified value. | ||
Enum.GetName(typeof(MyEnum), 1); // → " | Enum.GetName(typeof(MyEnum), 1); // → "Un" | ||
// Get the name of the constant. | |||
MyEnum.Un.ToString(); // "Un" | |||
// Liste des noms des éléments de l'énumération. | // Liste des noms des éléments de l'énumération. | ||
Ligne 32 : | Ligne 35 : | ||
// 3ème arg: IgnoreCase | // 3ème arg: IgnoreCase | ||
if (Enum.TryParse("un", true, out MyEnum myEnum)) { } | |||
if (Enum.TryParse("un", true, out myEnum)) { } | |||
</kode> | </kode> | ||
= Flags = | = [https://docs.microsoft.com/en-us/dotnet/api/system.flagsattribute Flags] = | ||
<kode lang=csharp> | <kode lang=csharp> | ||
[Flags] | [Flags] | ||
public enum Font { | public enum Font { | ||
Bold = 1, | Bold = 1, // 1 | ||
Italic = 2 | Italic = 1 << 1, // 2 | ||
Underlined = 4 | Underlined = 1 << 2, // 4 | ||
All = Bold | Italic | Underlined | All = Bold | Italic | Underlined | ||
} | } | ||
Ligne 56 : | Ligne 58 : | ||
// test si font contient Underlined | // test si font contient Underlined | ||
if (font.HasFlag(Font.Underlined)) { } | |||
if ((font & Font.Underlined) == Font.Underlined) { } | if ((font & Font.Underlined) == Font.Underlined) { } | ||
Ligne 65 : | Ligne 68 : | ||
int i = default(MyEnum); | int i = default(MyEnum); | ||
// retourne toujours 0, même si 0 n'est pas une valeur valide | // retourne toujours 0, même si 0 n'est pas une valeur valide | ||
</kode> | |||
= Description = | |||
<kode lang='cs'> | |||
var name = MyEnum.Un.ToString(); // Un | |||
var description = MyEnum.Un.GetDisplayName(); // Un ! | |||
var description = EnumExtension.GetDisplayName(typeof(MyEnum), 1); // Un ! | |||
enum MyEnum | |||
{ | |||
[Description("Un !")] | |||
Un = 1, | |||
[Description("Deux !")] | |||
Deux = 2 | |||
} | |||
public static class EnumExtension | |||
{ | |||
// extension method | |||
public static string GetDisplayName(this Enum source) | |||
{ | |||
var enumType = source.GetType(); | |||
var name = Enum.GetName(enumType, source); | |||
var fieldInfo = enumType.GetField(name); | |||
var attributes = fieldInfo.GetCustomAttributes<DescriptionAttribute>(); | |||
return attributes.SingleOrDefault()?.Description ?? name; | |||
} | |||
// static method | |||
public static string GetDisplayName(Type enumType, object value) | |||
{ | |||
var name = Enum.GetName(enumType, value); | |||
var fieldInfo = enumType.GetField(name); | |||
var attributes = fieldInfo.GetCustomAttributes<DescriptionAttribute>(); | |||
return attributes.SingleOrDefault()?.Description ?? name; | |||
} | |||
} | |||
</kode> | |||
= Parse string values to enum values = | |||
<kode lang='cs'> | |||
public static bool TryParse<T>(IReadOnlyCollection<string> values, out T[] results) | |||
where T : struct | |||
{ | |||
if (values == null) | |||
{ | |||
throw new ArgumentNullException(nameof(values)); | |||
} | |||
results = new T[values.Count]; | |||
var i = 0; | |||
foreach (var value in values) | |||
{ | |||
if (Enum.TryParse(value, out T result)) | |||
{ | |||
results[i++] = result; | |||
} | |||
else | |||
{ | |||
results = null; | |||
return false; | |||
} | |||
} | |||
return true; | |||
} | |||
</kode> | |||
= Parse string value matching Attribute to enum value = | |||
<kode lang='cs'> | |||
public static bool TryParse<TEnum, TAttribute>( | |||
string value, | |||
Func<TAttribute, string> attributePropertySelector, | |||
out TEnum result) | |||
where TEnum : struct | |||
{ | |||
var matchingField = typeof(TEnum).GetFields() | |||
.SelectMany( | |||
f => (IEnumerable<TAttribute>)f.GetCustomAttributes(typeof(TAttribute)), | |||
(f, a) => new { Field = f, Attribute = a }) | |||
.Where(x => attributePropertySelector(x.Attribute) == value) | |||
.Select(x => x.Field) | |||
.SingleOrDefault(); | |||
result = matchingField == null ? default : (TEnum)matchingField.GetRawConstantValue(); | |||
return matchingField != null; | |||
} | |||
if (EnumExtension.TryParse<MyEnum, DescriptionAttribute>("Un !", x => x.Description, out MyEnum e)) { } | |||
</kode> | </kode> |
Dernière version du 8 juillet 2024 à 13:03
Bases
enum MyEnum { Un = 1, Deux = 2 } // Compter le nombre d’élément d’une énumération. int count = Enum.GetValues(typeof(MyEnum)).Length; // Retrieves the name of the constant that has the specified value. Enum.GetName(typeof(MyEnum), 1); // → "Un" // Get the name of the constant. MyEnum.Un.ToString(); // "Un" // Liste des noms des éléments de l'énumération. Enum.GetNames(typeof(MyEnum)); // → "Un" | "Deux" // Liste des valeurs de l'énumération. Enum.GetValues(typeof(MyEnum)); // → MyEnum.Un | MyEnum.Deux |
Convertions
int / byte
byte unEntier = 1; MyEnum myEnum = (MyEnum)unEntier; // Deux byte unEntier = (byte)MyEnum.Deux; // 1 |
string
// Parser un string en enum. Génère un ArgumentException en cas d'échec. MyEnum myEnum = (MyEnum)Enum.Parse(typeof(MyEnum), "un", true); // 3ème arg: IgnoreCase if (Enum.TryParse("un", true, out MyEnum myEnum)) { } |
Flags
[Flags] public enum Font { Bold = 1, // 1 Italic = 1 << 1, // 2 Underlined = 1 << 2, // 4 All = Bold | Italic | Underlined } // gras et italique Font font = Font.Bold | Font.Italic; // ajout de souligné font |= Font.Underlined; // suppression de souligné font &= ~Font.Underlined; // test si font contient Underlined if (font.HasFlag(Font.Underlined)) { } if ((font & Font.Underlined) == Font.Underlined) { } Console.WriteLine(Font.Bold | Font.Italic | Font.Underlined); // All |
Default value
int i = default(MyEnum); // retourne toujours 0, même si 0 n'est pas une valeur valide |
Description
var name = MyEnum.Un.ToString(); // Un var description = MyEnum.Un.GetDisplayName(); // Un ! var description = EnumExtension.GetDisplayName(typeof(MyEnum), 1); // Un ! enum MyEnum { [Description("Un !")] Un = 1, [Description("Deux !")] Deux = 2 } public static class EnumExtension { // extension method public static string GetDisplayName(this Enum source) { var enumType = source.GetType(); var name = Enum.GetName(enumType, source); var fieldInfo = enumType.GetField(name); var attributes = fieldInfo.GetCustomAttributes<DescriptionAttribute>(); return attributes.SingleOrDefault()?.Description ?? name; } // static method public static string GetDisplayName(Type enumType, object value) { var name = Enum.GetName(enumType, value); var fieldInfo = enumType.GetField(name); var attributes = fieldInfo.GetCustomAttributes<DescriptionAttribute>(); return attributes.SingleOrDefault()?.Description ?? name; } } |
Parse string values to enum values
public static bool TryParse<T>(IReadOnlyCollection<string> values, out T[] results) where T : struct { if (values == null) { throw new ArgumentNullException(nameof(values)); } results = new T[values.Count]; var i = 0; foreach (var value in values) { if (Enum.TryParse(value, out T result)) { results[i++] = result; } else { results = null; return false; } } return true; } |
Parse string value matching Attribute to enum value
public static bool TryParse<TEnum, TAttribute>( string value, Func<TAttribute, string> attributePropertySelector, out TEnum result) where TEnum : struct { var matchingField = typeof(TEnum).GetFields() .SelectMany( f => (IEnumerable<TAttribute>)f.GetCustomAttributes(typeof(TAttribute)), (f, a) => new { Field = f, Attribute = a }) .Where(x => attributePropertySelector(x.Attribute) == value) .Select(x => x.Field) .SingleOrDefault(); result = matchingField == null ? default : (TEnum)matchingField.GetRawConstantValue(); return matchingField != null; } if (EnumExtension.TryParse<MyEnum, DescriptionAttribute>("Un !", x => x.Description, out MyEnum e)) { } |