Pregunta

¿Hay alguna forma en C # para:

  1. Obtenga todas las propiedades de una clase que tienen atributos (en lugar de tener que recorrer todas las propiedades y luego verificar si el atributo existe).

  2. Si quiero todas las propiedades públicas, internas y protegidas pero NO las propiedades privadas, no puedo encontrar una manera de hacerlo. Solo puedo hacer esto:

    PropertyInfo [] props = type.GetProperties (BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)

¿Hay alguna manera de evitar obtener propiedades privadas pero obtener todo lo demás?

¿Fue útil?

Solución

No creo que haya una manera de hacer ninguna de estas cosas.

Sin embargo, ¿sobre cuántos tipos tienes que reflexionar? ¿Es realmente un cuello de botella? ¿Puede almacenar en caché los resultados para evitar tener que hacerlo más de una vez por tipo?

Otros consejos

Con respecto al almacenamiento en caché: si accede a las propiedades a través de TypeDescriptor.GetProperties , entonces obtendrá el almacenamiento en caché de forma gratuita. La clase TypeDescriptor tiene otros métodos de utilidad útiles para situaciones de reflexión como esta. Solo funciona en las propiedades public (sin miembros protected o internal , y no hay campos).

Realmente no hay una forma de hacerlo más rápido , pero lo que puede hacer es hacerlo con menos frecuencia almacenando en caché los datos. Una clase de utilidad genérica puede ser una forma útil de hacer esto, por ejemplo:

static class PropertyCache<T>
{
    private static SomeCacheType cache;
    public static SomeCacheType Cache
    {
        get
        {
            if (cache == null) Build();
            return cache;
        }
    }
    static void Build()
    {
        /// populate "cache"
    }
}

Luego, su PropertyCache.Cache tiene los datos solo para Foo, etc., con una población perezosa. También puedes usar un constructor estático si lo prefieres.

En respuesta a (2): Si está fuera de la clase / conjunto en cuestión, internal y protected son lo mismo que private .

Si desea acceder a estos, deberá solicitar todas las propiedades, como ya lo ha hecho, y filtrar la lista usted mismo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top