Je voudrais savoir s'il est possible d'obtenir des attributs des enum
valeurs et non du enum
soi? Par exemple, supposons que j'ai les éléments suivants enum
:
using System.ComponentModel; // for DescriptionAttribute
enum FunkyAttributesEnum
{
[Description("Name With Spaces1")]
NameWithoutSpaces1,
[Description("Name With Spaces2")]
NameWithoutSpaces2
}
Ce que je veux, c'est le type enum, produire 2-tuples de la valeur de la chaîne enum et sa description.
La valeur était facile:
Array values = System.Enum.GetValues(typeof(FunkyAttributesEnum));
foreach (int value in values)
Tuple.Value = Enum.GetName(typeof(FunkyAttributesEnum), value);
Mais comment puis-je obtenir la valeur de l'attribut de description, pour remplir Tuple.Desc
? Je peux penser à la façon de le faire si l'attribut appartient à enum
lui - même, mais je ne sais pas comment l'obtenir de la valeur de la enum
.
c#
reflection
enums
.net-attributes
Alex K
la source
la source
DescriptionAttribute
.Réponses:
Cela devrait faire ce dont vous avez besoin.
la source
Ce morceau de code devrait vous donner une jolie petite méthode d'extension sur n'importe quelle énumération qui vous permet de récupérer un attribut générique. Je pense que c'est différent de la fonction lambda ci-dessus car elle est plus simple à utiliser et légèrement - il suffit de passer le type générique.
la source
IndexOutOfRangeException
?GetCustomAttributes()
puis d'obtenir le premier élément au lieu d'appelerGetCustomAttribute()
?Il s'agit d'une implémentation générique utilisant un lambda pour la sélection
Appelez ça comme ceci:
la source
FlagsAttribute
). Dans ce cas,enumeration.GetType().GetMember(enumeration.ToString())[0]
échouera.value.GetType().GetField(value.ToString()).GetCustomAttributes(false).OfType<T>().SingleOrDefault()
mais admettre que votre manière explicite est meilleure.J'ai fusionné quelques-unes des réponses ici pour créer une solution un peu plus extensible. Je le fournis juste au cas où il serait utile à quelqu'un d'autre à l'avenir. Publication originale ici .
Cette solution crée une paire de méthodes d'extension sur Enum. Le premier vous permet d'utiliser la réflexion pour récupérer tout attribut associé à votre valeur. Le second appelle spécifiquement récupère le
DescriptionAttribute
et retourne saDescription
valeur.Par exemple, envisagez d'utiliser l'
DescriptionAttribute
attribut deSystem.ComponentModel
Pour utiliser la méthode d'extension ci-dessus, vous devez maintenant simplement appeler ce qui suit:
ou
la source
En plus de la réponse d'AdamCrawford , j'ai en outre créé des méthodes d'extension plus spécialisées qui s'en nourrissent pour obtenir la description.
par conséquent, pour obtenir la description, vous pouvez soit utiliser la méthode d'extension d'origine comme
ou vous pouvez simplement appeler la méthode d'extension ici comme:
J'espère que cela devrait rendre votre code un peu plus lisible.
la source
Une doublure fluide ...
Ici, j'utilise le
DisplayAttribute
qui contient à la fois les propriétésName
etDescription
.Exemple
Production
la source
Voici le code pour obtenir des informations d'un attribut Display. Il utilise une méthode générique pour récupérer l'attribut. Si l'attribut n'est pas trouvé, il convertit la valeur d'énumération en une chaîne avec le cas pascal / camel converti en cas de titre (code obtenu ici )
Et voici la méthode d'extension pour les chaînes à convertir en casse de titre:
la source
J'ai implémenté cette méthode d'extension pour obtenir la description des valeurs d'énumération. Cela fonctionne pour toutes sortes d'énumérations.
la source
Obtenez le dictionnaire d'énumération.
Maintenant, appelez ça comme ...
EnumDecription Ext, méthode
la source
Voici la version .NET Core de la réponse d'AdamCrawford, utilisant System.Reflection.TypeExtensions ;
la source
Ajout de ma solution pour Net Framework et NetCore.
J'ai utilisé cela pour ma mise en œuvre de Net Framework:
Cela ne fonctionne pas pour NetCore, je l'ai donc modifié pour ce faire:
Exemple d'énumération:
Exemple d'utilisation pour l'un ou l'autre statique ajouté:
la source
Tirant parti de certaines des nouvelles fonctionnalités du langage C #, vous pouvez réduire le nombre de lignes:
la source
J'ai cette réponse pour configurer une zone de liste déroulante à partir d'un attribut enum qui était super.
J'ai ensuite eu besoin de coder l'inverse afin que je puisse obtenir la sélection de la boîte et renvoyer l'énumération dans le bon type.
J'ai également modifié le code pour gérer le cas où un attribut manquait
Pour les avantages de la prochaine personne, voici ma solution finale
}
la source
Si votre
enum
contient une valeur telle queEquals
vous pourriez rencontrer quelques bogues en utilisant certaines extensions dans de nombreuses réponses ici. C'est parce qu'il est normalement supposé quetypeof(YourEnum).GetMember(YourEnum.Value)
ne retournerait qu'une seule valeur, qui est laMemberInfo
votreenum
. Voici une version légèrement plus sûre de la réponse d'Adam Crawford .la source
Cette méthode d'extension obtiendra une représentation sous forme de chaîne d'une valeur d'énumération à l'aide de son XmlEnumAttribute. Si aucun XmlEnumAttribute n'est présent, il revient à enum.ToString ().
la source
Et si vous voulez la liste complète des noms, vous pouvez faire quelque chose comme
la source
Les gars si ça aide je vais partager avec vous ma solution: Définition de l'attribut personnalisé:
Maintenant, parce que j'en avais besoin dans la définition HtmlHelper de l'extension HtmlHelper:
J'espère que cela aide
la source
Maintenant, il produira une erreur dans ce cas 1 "Égale"
donc s'il s'agit du même nom enum de retour plutôt que nom d'affichage car enumMember.GetCustomAttribute () obtient null si le nom d'affichage et le nom d'énumération sont identiques .....
la source
Vous pouvez également effectuer les opérations suivantes:
la source
C'est ainsi que je l'ai résolu sans utiliser d'aides ou d'extensions personnalisées avec .NET core 3.1.
Classe
Rasoir
la source
La performance compte
Si vous voulez de meilleures performances, voici la voie à suivre:
Pourquoi cela a-t-il de meilleures performances?
Parce que les méthodes intégrées utilisent toutes du code très similaire à ceci, sauf qu'elles exécutent également un tas d'autres codes dont nous ne nous soucions pas . Le code Enum de C # est assez horrible en général.
Le code ci-dessus a été Linq-ified et rationalisé afin qu'il ne contienne que les bits qui nous intéressent.
Pourquoi le code intégré est-il lent?
Premièrement concernant Enum.ToString () -vs- Enum.GetName (..)
Utilisez toujours ce dernier. (Ou mieux encore ni l'un ni l'autre, comme cela apparaîtra clairement ci-dessous.)
ToString () utilise ce dernier en interne, mais encore une fois, fait un tas d'autres choses que nous ne voulons pas, par exemple, essaie de combiner des drapeaux, d'imprimer des nombres, etc. Nous ne sommes intéressés que par les constantes définies à l'intérieur de l'énumération.
Enum.GetName obtient à son tour tous les champs, crée un tableau de chaînes pour tous les noms, utilise le ToUInt64 ci-dessus sur tous leurs RawConstantValues pour créer un tableau UInt64 de toutes les valeurs, trie les deux tableaux en fonction de la valeur UInt64 et obtient enfin le nom de le tableau de noms en faisant une recherche binaire dans le tableau UInt64 pour trouver l'index de la valeur que nous voulions.
... puis nous jetons les champs et les tableaux triés utilisent ce nom pour retrouver le champ.
Un mot: "Ugh!"
la source
Vous pouvez également effectuer les opérations suivantes:
Et obtenez la description avec ce qui suit:
À mon avis, c'est une façon plus efficace de faire ce que vous voulez accomplir, car aucune réflexion n'est nécessaire.
la source
Vous pouvez également définir une valeur d'énumération comme
Name_Without_Spaces
, et lorsque vous voulez une description, utilisezName_Without_Spaces.ToString().Replace('_', ' ')
pour remplacer les traits de soulignement par des espaces.la source