A razão pela qual as pessoas têm receio de usar a reflexão desnecessariamente não é o desempenho: sim, há alguma sobrecarga no uso da reflexão, mas, muitas vezes, resolver o problema sem ele requer uma abordagem diferente com complexidade comparável e, mesmo que não, a sobrecarga é raramente significativo (especialmente para o desenvolvimento no nível do aplicativo).
Usando a reflexão, algumas suposições importantes que normalmente se pode fazer sobre o código-fonte são desfeitas e ferramentas como "Localizar todas as referências" deixam de funcionar de maneira confiável. O Reflection também basicamente remove a maior parte da segurança de tipo que o compilador aplica, digamos, C #, e a maioria dos erros de programação que um sistema de tipo normalmente captura e traduz em erros do compilador, agora se tornam erros de tempo de execução na melhor das hipóteses ou, na pior das hipóteses, erros muito obscuros.
Então, por que as pessoas usam a reflexão então? Simplificando, porque apesar dos problemas descritos acima, é uma ferramenta muito valiosa. Pensando bem, alguns dos benefícios da programação dinâmica podem ser obtidos em uma linguagem estática e estritamente tipada como C #, e as linguagens de programação dinâmica demonstraram seus méritos recentemente, especialmente no campo da programação na Web - PHP, Javascript e Python com bastante destaque. , todos usam digitação dinâmica e provaram ser bons ajustes para programação na Web. Mas como o idioma ainda é C #, você pode optar por manter a maior parte do seu aplicativo em um idioma OOP estritamente digitado e escrever a pequena parte em que o comportamento dinâmico realmente faz diferença com a reflexão.
Um exemplo típico é quando você precisa expor métodos como chamadas de serviço da Web (usando um protocolo ainda não incorporado no .NET). A abordagem OOP estritamente tipificada funciona, mas é excessivamente restritiva e desajeitada. Mas se você usar a reflexão para mapear chamadas para métodos e pares de chave / valor para argumentos, poderá escrever o encanamento para um serviço da Web uma vez e usá-lo em qualquer classe que desejar.