Pergunta

Existe uma maneira em C # para:

  1. Get todas as propriedades de uma classe que têm atributos sobre eles (versus ter que percorrer todas as propriedades e, em seguida, verifique se o atributo existe.

  2. Se eu quero todas as propriedades públicas, interno e protegido, mas não propriedades privadas, não consigo encontrar uma maneira de fazer isso. Eu só posso fazer isso:

    PropertyInfo [] adereços = type.GetProperties (BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)

Existe uma maneira de evitar propriedades privadas, mas não obter tudo o resto.

Foi útil?

Solução

Eu não acredito que há uma maneira de fazer qualquer um destes.

Apenas quantos tipos você tem que refletir sobre, embora? É realmente um gargalo? Você é capaz de armazenar em cache os resultados para evitar ter de fazê-lo mais de uma vez por tipo?

Outras dicas

Em relação cache: se você acessar as propriedades via TypeDescriptor.GetProperties então você obtém o cache de forma gratuita. A classe TypeDescriptor tem alguns outros métodos de utilitário bom para situações de reflexão como este. Ele só funciona em propriedades public embora (sem protected ou internal membros, e nenhum campo).

Não há realmente uma maneira de fazê-lo de mais rápido - mas o que você pode fazer é fazê-lo com menos frequência, armazenando os dados. A classe de utilitário genérico pode ser uma maneira prática de fazer isso, por exemplo:

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

Em seguida, seu PropertyCache.Cache tem os dados apenas para Foo, etc - com população preguiçoso. Você também pode usar um construtor estático, se preferir.

Em resposta a (2):. Se você estiver fora da classe / montagem em questão, internal e protected são os mesmos que private

Se você deseja acessar estes, você vai precisar de pedir para todas as propriedades, como você já fez, e filtrar a lista de si mesmo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top