Question

Y a-t-il un moyen en C # de:

  1. 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.

  2. 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?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top