Comment puis-je convertir les méthodes GetWithOrder
pour renvoyer l'énumération actuelle dans le bon ordre? Cela fonctionne pour la chaîne de l'enum, mais je veux la valeur Enum réelle, plus elle doit être générique bien sûr.Renvoyer la liste enum au lieu de la chaîne dans l'extension d'extension helper
[AttributeUsage(AttributeTargets.Field, AllowMultiple = false)]
public class EnumOrderAttribute : Attribute
{
public int Order { get; set; }
}
public static class EnumExtenstions
{
public static IEnumerable<string> GetWithOrder(this Enum enumVal)
{
return enumVal.GetType().GetWithOrder();
}
public static IEnumerable<string> GetWithOrder(this Type type)
{
if (!type.IsEnum)
{
throw new ArgumentException("Type must be an enum");
}
// caching for result could be useful
return type.GetFields()
.Where(field => field.IsStatic)
.Select(field => new
{
field,
attribute = field.GetCustomAttribute<EnumOrderAttribute>()
})
.Select(fieldInfo => new
{
name = fieldInfo.field.Name,
order = fieldInfo.attribute != null ? fieldInfo.attribute.Order : 0
})
.OrderBy(field => field.order)
.Select(field => field.name);
}
}
public enum TestEnum
{
[EnumOrder(Order=2)]
Second = 1,
[EnumOrder(Order=1)]
First = 4,
[EnumOrder(Order=3)]
Third = 0
}
var names = typeof(TestEnum).GetWithOrder();
var names = TestEnum.First.GetWithOrder();
Je me demande simplement - pourquoi auriez-vous un ordre de membres enum qui n'est pas classé par ordre alphabétique ou par valeur? –
Peut-être parce qu'ils sont stockés dans une base de données, et l'ajout de nouvelles énumérations peut avoir besoin d'être mis dans un certain ordre lorsqu'il est affiché, mais pas lié à la valeur stockée. –
Cela n'aurait-il pas plus de sens de mettre le 'EnumOrderAttribute' sur les valeurs' Enum' et de simplement le vérifier lors de l'itération de 'Enum.GetValues ()'? – DiskJunky