Domanda

Esiste un modo in C # per:

  1. Ottieni tutte le proprietà di una classe che hanno degli attributi (invece di dover scorrere tutte le proprietà e quindi verificare se esiste l'attributo.

  2. Se desidero tutte le proprietà pubbliche, interne e protette ma NON le proprietà private, non riesco a trovare un modo per farlo. Posso solo fare questo:

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

C'è un modo per evitare di ottenere proprietà private ma ottenere tutto il resto.

È stato utile?

Soluzione

Non credo che ci sia un modo per fare uno di questi.

Tuttavia, su quanti tipi devi riflettere? È davvero un collo di bottiglia? Sei in grado di memorizzare nella cache i risultati per evitare di doverlo fare più di una volta per tipo?

Altri suggerimenti

Riguardo alla memorizzazione nella cache: se si accede alle proprietà tramite TypeDescriptor.GetProperties , si ottiene gratuitamente la memorizzazione nella cache. La classe TypeDescriptor ha alcuni altri metodi di utilità utili per situazioni di riflessione come questa. Funziona solo con le proprietà public (nessun membro protetto o interno e nessun campo).

Non c'è davvero modo di farlo più velocemente , ma quello che puoi fare è farlo meno spesso memorizzando nella cache i dati. Una classe di utilità generica può essere un modo pratico per farlo, ad esempio:

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

Quindi PropertyCache.Cache ha i dati solo per Foo, ecc. - con popolazione pigra. Puoi anche usare un costruttore statico se preferisci.

In risposta a (2): se sei al di fuori della classe / assembly in questione, internal e protetto sono gli stessi di private .

Se si desidera accedere a questi, è necessario richiedere tutte le proprietà, come già fatto, e filtrare l'elenco da soli.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top