Comment obtenir une liste de propriétés avec un atsortingbut donné?

J’ai un type, t , et j’aimerais avoir une liste des propriétés publiques qui ont l’atsortingbut MyAtsortingbute . L’atsortingbut est marqué avec AllowMultiple = false , comme ceci:

 [AtsortingbuteUsage(AtsortingbuteTargets.Property, AllowMultiple = false)] 

Actuellement, c’est ce que j’ai, mais je pense qu’il y a un meilleur moyen:

 foreach (PropertyInfo prop in t.GetProperties()) { object[] atsortingbutes = prop.GetCustomAtsortingbutes(typeof(MyAtsortingbute), true); if (atsortingbutes.Length == 1) { //Property with my custom atsortingbute } } 

Comment puis-je améliorer cela? Je vous prie de m’excuser s’il s’agit d’un doublon, il y a une tonne de fils de reflection là-bas … semble être un sujet très chaud.

 var props = t.GetProperties().Where( prop => Atsortingbute.IsDefined(prop, typeof(MyAtsortingbute))); 

Cela évite d’avoir à matérialiser des instances d’atsortingbut (c.-à-d. GetCustomAtsortingbute[s]() est moins cher que GetCustomAtsortingbute[s]() .

La solution que j’utilise le plus est basée sur la réponse de Tomas Pesortingcek. Je veux généralement faire quelque chose avec l’atsortingbut et la propriété.

 var props = from p in this.GetType().GetProperties() let attr = p.GetCustomAtsortingbutes(typeof(MyAtsortingbute), true) where attr.Length == 1 select new { Property = p, Atsortingbute = attr.First() as MyAtsortingbute}; 

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:

 var props = from p in t.GetProperties() let attrs = p.GetCustomAtsortingbutes(typeof(MyAtsortingbute), true) where attrs.Length != 0 select p; // Do something with the properties in 'props' 

Je crois que cela vous aide à structurer le code de manière plus lisible.

Il y a toujours LINQ:

 t.GetProperties().Where( p=>p.GetCustomAtsortingbutes(typeof(MyAtsortingbute), true).Length != 0) 

Si vous traitez régulièrement des atsortingbuts dans Reflection, il est très pratique de définir des méthodes d’extension. Vous verrez cela dans de nombreux projets. Celui-ci en est un que j’ai souvent:

 public static bool HasAtsortingbute(this ICustomAtsortingbuteProvider provider) where T : Atsortingbute { var atts = provider.GetCustomAtsortingbutes(typeof(T), true); return atts.Length > 0; } 

que vous pouvez utiliser comme typeof(Foo).HasAtsortingbute();

D’autres projets (par exemple, StructureMap) ont des classes ReflectionHelper à part entière qui utilisent des arbres d’expression pour avoir une syntaxe précise à identifier, par exemple PropertyInfos. L’utilisation ressemble alors à ceci:

 ReflectionHelper.GetProperty(x => x.MyProperty).HasAtsortingbute() 

En plus des réponses précédentes: il est préférable d’utiliser la méthode Any() au lieu de vérifier la longueur de la collection:

 propertiesWithMyAtsortingbute = type.GetProperties() .Where(x => x.GetCustomAtsortingbutes(typeof(MyAtsortingbute), true).Any()); 

le meilleur moyen:

 //if (atsortingbutes.Length == 1) if (atsortingbutes.Length != 0)