Atenção: esse artigo tem um vídeo complementar. Clique e assista!

De que se trata o artigo

Neste artigo será abordado um poderosíssimo recurso do Microsoft .NET Framework que provê meios para recuperação e manipulação de informações sobre tipos de dados em tempo de execução, oferecendo mecanismos dinâmicos à programação.

Para que serve

Com o uso de reflection é permitido ao desenvolvedor inspecionar o conteúdo interno dos executáveis gerados pelo compilador, possibilitando a identificação de forma programática dos módulos, tipos de dados e membros disponíveis dentro de um arquivo. Por exemplo, é possível consultar quais são métodos disponíveis em uma determinada classe e até mesmo acioná-los em tempo de execução sem mesmo saber que estes existem em tempo de desenvolvimento.

Em que situação o tema é útil

Um exemplo bem clássico onde o reflection pode ser útil é na construção de plugins, um modelo de arquitetura que permite acoplar e estender funcionalidades a um produto de software, realizando isto através de interfaces bem definidas. Uma vantagem muito significativa deste modelo de programação é que possibilita a alteração do comportamento de um software sem a necessidade de recompilar todo o projeto.

Reflection

O assunto que iremos abordar nesta matéria é de suma importância para estabelecer mecanismos dinâmicos na programação de projetos de sistemas. Com o uso de Reflection é permitido ao desenvolvedor criar componentes de software acopláveis. Neste artigo descrevemos como o CLR (Common Language Runtime) realiza este processo de reflexão através da estrutura de metadados, como é possível recuperar informações sobre tipos de dados em tempo de execução. Na parte prática construiremos uma aplicação extensível, onde através do arquivo de configuração estabeleceremos o comportamento dos botões, associando um método de um executável qualquer ao evento de clique dos botões.

Definitivamente a tarefa de desenvolver software é algo que envolve técnica e criatividade, podemos assumir que uma determinada demanda pode ser construída de diversas formas, empregando conceitos e tecnologias diferentes e ao mesmo tempo atingir o resultado esperado. Entre estas diversas maneiras existem formas mais elegantes que expressam maior clareza, outras mais eficientes que consomem menos recursos computacionais e aí por diante. Um fator que determina a qualidade da solução é sem sombra de dúvida o conhecimento e experiência adquirida ao longo de uma carreira. Um conhecimento indispensável para o desenvolvedor .NET é o uso de reflection, ao decorrer deste artigo iremos entender como este recurso pode auxiliar em muitas situações do dia a dia trazendo resultados interessantes.

Com reflection o desenvolvedor pode realizar operações como: fazer a chamada a um método, instanciar um objeto, acessar dados de uma propriedade etc. de uma forma diferente e totalmente dinâmica. Um exemplo disto é acionar um método qualquer dentro de uma classe informando o nome deste método em tempo de execução através de uma string. Isto mesmo, ao invés de declarar o acionamento do método dentro de outro método da forma convencional, podemos acionar um método chamado InvokeMember da classe Type e atribuir como argumento o nome dos métodos a ser executado dentro de uma determinada classe, neste momento o CLR (Common Language Runtime) verificará se este método existe, atribuir os parâmetros necessários e ativar a execução do método.

Mas qual é a real vantagem ou aplicabilidade disto? Alguém poderia se perguntar, imagine um algoritmo que através de uma estrutura condicional determine o fluxo de execução de outros métodos, se a condição (1) um for igual a uma determinada string, então execute o método “A” caso a condição (2) dois seja satisfeita execute o método “B” e assim por diante. Supondo que tenhamos dez métodos dentro desta estrutura condicional, teremos por volta de vinte linhas de código isto dependendo da disposição do mesmo. Podemos obter este mesmo resultado e eliminar toda esta estrutura condicional substituindo o valor da string pelo nome do método a ser executado e invocar o método InvokeMember da classe Type, com isso teremos a redução para uma linha de código.

...
Quer ler esse conteúdo completo? Tenha acesso completo