J'ai une classe, appelons-la Book avec une propriété appelée Name. Avec cette propriété, j'ai un attribut qui lui est associé.
public class Book
{
[Author("AuthorName")]
public string Name
{
get; private set;
}
}
Dans ma méthode principale, j'utilise la réflexion et je souhaite obtenir une paire clé-valeur de chaque attribut pour chaque propriété. Donc, dans cet exemple, je m'attends à voir "Author" pour le nom de l'attribut et "AuthorName" pour la valeur de l'attribut.
Question: Comment obtenir le nom et la valeur d'attribut sur mes propriétés à l'aide de Reflection?
c#
reflection
propertyinfo
developerdoug
la source
la source
Réponses:
Utilisez
typeof(Book).GetProperties()
pour obtenir un tableau d'PropertyInfo
instances. Utilisez ensuiteGetCustomAttributes()
sur chacunPropertyInfo
d' eux pour voir si l'un d'eux a leAuthor
type d'attribut. S'ils le font, vous pouvez obtenir le nom de la propriété à partir des informations de propriété et les valeurs d'attribut à partir de l'attribut.Quelque chose le long de ces lignes pour analyser un type pour les propriétés qui ont un type d'attribut spécifique et pour retourner des données dans un dictionnaire (notez que cela peut être rendu plus dynamique en passant des types dans la routine):
la source
Pour obtenir tous les attributs d'une propriété dans un dictionnaire, utilisez ceci:
n'oubliez pas de passer de
false
àtrue
si vous souhaitez également inclure les attributs hérités.la source
Si vous voulez juste une valeur d'attribut spécifique Par exemple, Attribut d'affichage, vous pouvez utiliser le code suivant:
la source
J'ai résolu des problèmes similaires en écrivant un assistant d'attribut de propriété d'extension générique:
Usage:
la source
Fields
?Vous pouvez utiliser
GetCustomAttributesData()
etGetCustomAttributes()
:la source
Si vous voulez dire "pour les attributs qui prennent un paramètre, répertoriez les noms d'attribut et la valeur de paramètre", cela est plus facile dans .NET 4.5 via l'
CustomAttributeData
API:la source
la source
Bien que les réponses les plus votées ci-dessus fonctionnent certainement, je suggère d'utiliser une approche légèrement différente dans certains cas.
Si votre classe a plusieurs propriétés avec toujours le même attribut et que vous souhaitez obtenir ces attributs triés dans un dictionnaire, voici comment:
Cela utilise toujours le cast mais garantit que le cast fonctionnera toujours car vous n'obtiendrez que les attributs personnalisés du type "AuthorName". Si vous aviez plusieurs attributs ci-dessus, les réponses obtiendraient une exception de conversion.
la source
Usage:
ou:
la source
Voici quelques méthodes statiques que vous pouvez utiliser pour obtenir la longueur maximale ou tout autre attribut.
Utilisation de la méthode statique ...
Ou en utilisant la méthode d'extension facultative sur une instance ...
Ou en utilisant la méthode statique complète pour tout autre attribut (StringLength par exemple) ...
Inspiré par la réponse de Mikael Engver.
la source
Nécromancement.
Pour ceux qui doivent encore maintenir .NET 2.0, ou ceux qui veulent le faire sans LINQ:
Exemple d'utilisation:
ou simplement
la source
Dans cet exemple, j'ai utilisé DisplayName au lieu d'Auteur car il a un champ nommé «DisplayName» à afficher avec une valeur.
la source
pour obtenir l'attribut de enum, j'utilise:
// En utilisant
la source
Je cherche juste le bon endroit pour mettre ce morceau de code.
disons que vous avez la propriété suivante:
Et vous souhaitez obtenir la valeur ShortName. Tu peux faire:
Ou pour le rendre général:
la source