J'ai un type, t
et j'aimerais obtenir une liste des propriétés publiques qui ont l'attribut MyAttribute
. L'attribut est marqué AllowMultiple = false
comme suit:
[AttributeUsage(AttributeTargets.Property, AllowMultiple = false)]
Actuellement, ce que j'ai, c'est ceci, mais je pense qu'il y a une meilleure façon:
foreach (PropertyInfo prop in t.GetProperties())
{
object[] attributes = prop.GetCustomAttributes(typeof(MyAttribute), true);
if (attributes.Length == 1)
{
//Property with my custom attribute
}
}
Comment puis-je améliorer cela? Mes excuses s'il s'agit d'un doublon, il y a une tonne de fils de réflexion là-bas ... semble être un sujet assez brûlant.
c#
.net
reflection
wsanville
la source
la source
Réponses:
Cela évite d'avoir à matérialiser des instances d'attribut (c'est-à-dire qu'il est moins cher que
GetCustomAttribute[s]()
.la source
get
n'est pas appelée même lors de l'utilisationGetCustomAttributes
; cependant, l'attribut est instancié , ce qui n'est pas gratuit. Si vous n'avez pas besoin de vérifier des valeurs spécifiques de l'attribut,IsDefined
c'est moins cher. Et en 4.5, il existe des moyens de vérifier les données d'instanciation sans créer réellement d'instances d'attribut (bien que cela soit destiné à des scénarios très spécifiques uniquement)La solution que j'utilise le plus est basée sur la réponse de Tomas Petricek. Je veux habituellement faire quelque chose avec à la fois l'attribut et la propriété.
la source
Pour autant que je sache, il n'y a pas de meilleure façon de travailler avec la bibliothèque Reflection de manière plus intelligente. Cependant, vous pouvez utiliser LINQ pour rendre le code un peu plus agréable:
Je crois que cela vous aide à structurer le code d'une manière plus lisible.
la source
Il y a toujours LINQ:
la source
Si vous traitez régulièrement avec Attributes in Reflection, il est très, très pratique de définir certaines méthodes d'extension. Vous le constaterez dans de nombreux projets. Celui-ci en est un que j'ai souvent:
que vous pouvez utiliser comme
typeof(Foo).HasAttribute<BarAttribute>();
D'autres projets (par exemple StructureMap) ont des classes ReflectionHelper à part entière qui utilisent des arbres d'expression pour avoir une syntaxe fine pour identifier par exemple PropertyInfos. L'utilisation ressemble alors à ça:
la source
En plus des réponses précédentes: il est préférable d'utiliser la méthode
Any()
plutôt que de vérifier la longueur de la collection:L'exemple sur dotnetfiddle: https://dotnetfiddle.net/96mKep
la source
.Any()
ne vérifie pas la longueur. Mais ma réponse ne concernait pas les propriétés trouvées avec exactement un attribut. Deuxièmement, je ne suis pas sûr que vous ayez lu le code correctement -.Any
méthode appelée sur le résultat de laGetCustomAttrubutes
méthode. Le type depropertiesWithMyAttribute
sera donc la collection des propriétés. Consultez l'exemple sur dotnetfiddle (j'ajoute le lien vers la réponse).