Desenvolvimento - C#
.Net Framework Inside : Introdução a Reflection
Veremos neste artigo uma introdução ao conceito de Reflection (Reflexão).
por Guilherme Bacellar MoralezVamos falar um pouco sobre Reflection, mais especificamente neste artigo sobre introdução e conceitos básicos.
O que é e para que serve?
Reflection é a forma como o .NET permite acessar características (construtores, propriedades, métodos, atributos, etc) em Runtime.
O uso de Reflexão (Reflection) é extremamente útil quando falamos de mecanismos de plug-ins, driver e todo outro mecanismo que exija Late Bind (Instância Tardia).
O que é Early Bind?
Vamos falar um pouco de Early Bind antes de começar a falar de Late Bind.
Basicamente, Early Bind é o que fazemos no dia a dia:
C#
System.Security.Cryptography.SHA512 crip = System.Security.Cryptography.SHA512Managed.Create();
VB.Net
Dim crip As System.Security.Cryptography.SHA512 = System.Security.Cryptography.SHA512Managed.Create()
O que observamos neste exemplo é que sabemos antecipadamente o que vamos fazer, ou seja sabemos Early (cedo).
Contudo, existem situações em que não sabemos. Em nosso caso, imagine que vamos precisar usar criptografia, mas, só vamos saber qual algoritmo usado durante o uso do sistema, então, como fazer?
O que é Late Bind?
Em suma, é a criação de instância de objetos que não temos com antecedência o tipo ou a referência do mesmo.
C#
string tipoCriptografia = "System.Security.Cryptography.SHA512Managed";
System.Security.Cryptography.HashAlgorithm crip = (HashAlgorithm) Activator.CreateInstance(Type.GetType(tipoCriptografia));
VB.Net
Dim tipoCriptografia As String = "System.Security.Cryptography.SHA512Managed"
Dim crip As System.Security.Cryptography.HashAlgorithm = CType(Activator.CreateInstance(Type.GetType(tipoCriptografia)), HashAlgorithm)
Os dois exemplos fazem exatamente a mesma coisa, ou seja, criam uma instância da classe “SHA512Managed” para criptografia de Hash, mas, no Late Bind só sabemos o tipo da classe depois.
Não se preocupe em entender esse exemplo agora, eu garanto que ao chegar ao final dos artigos sobre reflexão você vai voltar aqui e entender tudo.
Tipos, O que são Tipos e há Tipos em todos os lugares...
Primeiramente deixem-me apresentá-los a uma entidade do .Net conhecida como “tipo” (Type), eles são as estruturas fundamentais de tudo.
Se você alguma vez já criou uma classe então você já utilizou um “tipo”.
C#
namespace ReflectionCSharp
{
public class Calculo
{
}
}
VB.NET
Namespace ReflectionVBNet
Public Class Calculo
End Class
End Namespace
No código acima criamos uma classe com o nome “Calculo”, então o “tipo” dela seria “Calculo” certo?
ERRADO!
Um “tipo” é a soma do Namespace mais a Classe.
Em algumas situações temos de especificar além do Namespace e do nome da Classe, o assembly em que ela está contido, a versão, o idioma e a chave pública da assinatura do assembly (caso exista).
Não vamos usar tipos completos neste artigo, mas como exemplo:
System.Configuration.ApplicationSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
A estrutura de declaração de um tipo é:
(Namespace).(Classe), (Assembly), (Versão), (Cultura), (Chave Pública da Assinatura do Assembly)
Lembram do Namespace que usamos em nosso exemplo acima?
Em sua forma completa ele ficaria (Isso com o .Net 2.0):
System.Security.Cryptography.SHA512Managed, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
Então, vamos gravar a seguinte frase: “Sem Tipos, sem Reflexão”.
Com os Tipos, vamos ao que podemos fazer
Bom, sabendo o que é um “Tipo” você deve se perguntar o que podemos fazer com eles?
A resposta mais simples é: Tudo, menos fazer manteiga.
Vamos pensar assim: O que tem dentro de um “tipo”?
Se pensarmos que um “tipo” é uma espécie de “ponteiro” para uma “classe” então podemos deduzir que temos:
- ·
Elementos públicos (com o modificador Public) podem ser acessados
por todos que utilizam o elemento, em outras palavras, não há limitação de
visibilidade.
- ·
Elementos privados (com o modificador Private) podem ser
acessados única e exclusivamente dentro do próprio elemento aonde foi declarado
(se for uma propriedade de uma classe, então, ele pode ser acessado apenas de
dentro desta classe)
- ·
Elementos internos (com o modificador Internal) podem ser
acessados apenas de dentro do seu próprio assembly.
- ·
Elementos protegidos (com o modificador Protected) podem ser
acessados de dentro do próprio elemento de declaração e também podem ser
acessados de dentro de classe que acabe herdando o elemento em que este foi declarado
(uma classe filha e uma classe pai).
Vejamos agora um modificador de acessibilidade dos elementos:
- ·
Elementos estáticos (Static) são acessados sem que a instância do
elemento em que foram declarados precise ser criada pelo programador. São muito
comuns em métodos.
É importante termos em mente esses modificadores, pois, na hora de utilizarmos a reflexão eles serão de grande importância.
Até o próximo artigo sobre Reflection.