Optimisations de réflexion avec attributs.
-
05-07-2019 - |
Question
Y a-t-il un moyen en C # de:
-
Obtenez toutes les propriétés d'une classe qui ont des attributs (plutôt que de devoir parcourir toutes les propriétés, puis vérifier si un attribut existe.
-
Si je veux toutes les propriétés publiques, internes et protégées, mais PAS les propriétés privées, je ne peux pas trouver un moyen de le faire. Je ne peux que faire ceci:
PropertyInfo [] props = type.GetProperties (BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)
Existe-t-il un moyen d'éviter d'obtenir des propriétés privées, mais d'obtenir tout le reste?
La solution
Je ne crois pas qu'il y ait un moyen de faire l'un ou l'autre.
Combien de types devez-vous réfléchir, cependant? Est-ce vraiment un goulot d'étranglement? Pouvez-vous mettre les résultats en mémoire cache pour éviter de devoir le faire plusieurs fois par type?
Autres conseils
En ce qui concerne la mise en cache: si vous accédez aux propriétés via TypeDescriptor.GetProperties
, la mise en cache est gratuite. La classe TypeDescriptor
a quelques autres méthodes utilitaires intéressantes pour des situations de réflexion comme celle-ci. Cependant, il ne fonctionne que sur les propriétés public
(aucun membre protected
ou interne
, et aucun champ).
Il n’existe pas vraiment de moyen de le faire plus rapidement - mais vous pouvez le faire moins souvent en mettant en cache les données. Une classe d’utilité générique peut être un moyen pratique de le faire, par exemple:
static class PropertyCache<T>
{
private static SomeCacheType cache;
public static SomeCacheType Cache
{
get
{
if (cache == null) Build();
return cache;
}
}
static void Build()
{
/// populate "cache"
}
}
Ensuite, votre PropertyCache.Cache a les données uniquement pour Foo, etc. - avec une population paresseuse. Vous pouvez également utiliser un constructeur statique si vous préférez.
En réponse à (2): si vous ne faites pas partie de la classe / de l'assembly en question, internal
et protected
sont identiques à private
.
Si vous souhaitez y accéder, vous devez demander toutes les propriétés, comme vous l'avez déjà fait, et filtrer la liste vous-même.