otimizações de reflexão com atributos.
-
05-07-2019 - |
Pergunta
Existe uma maneira em C # para:
-
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.
-
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.
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.