Desenvolvimento - C#
.Net Framework Inside : Reflection e Fields (Campos)
Neste artigo veremos sobre Fields que são “variáveis” de escopo dos objetos (classes).
por Guilherme Bacellar MoralezOs Fields são “variáveis” de escopo dos objetos (classes).
São utilizados em sua maioria para armazenar o valor das propriedades, mas, também muito utilizados para armazenar valores que podem ser utilizados pelos objetos para controles internos ou em outros momentos.
Podemos fazer uma analogia de um Field como uma Variável Global e um Objeto.
Porque recuperar os Fields?
Bom, eu acredito que existem duas respostas a essa pergunta e darei as duas:
1-) Para aprender;
2-) Para alterar o comportamento de um determinado objeto;
Seja qual for sua motivação, lá vamos nós.....
Recuperando todos os Fields
Em nosso objeto de exemplo (Usuário) não possuímos Fields (Campos), mas, você pode experimentar alterar os Fields para Publico para testar o código .NET abaixo.
C#
// Cria Objetos
Type meuTipo;
FieldInfo[] meusCampos;
// Recupera o Tipo Desejado
meuTipo = typeof(Usuario);
// Recupera o Todos os Fields
meusCampos = meuTipo.GetFields();
VB.Net
" Cria Objetos
Dim meuTipo As Type
Dim meusCampos As FieldInfo()
" Recupera o Tipo Desejado
meuTipo = GetType(Usuario)
" Recupera o Todos os Fields
meusCampos = meuTipo.GetFields()
Recuperando um (01) Field Específico
C#
// Cria Objetos
Type meuTipo;
FieldInfo meuCampo;
// Recupera o Tipo Desejado
meuTipo = typeof(Usuario);
// Recupera o Field (_Nome)
meuCampo = meuTipo.GetField("_Nome");
VB.Net
" Cria Objetos
Dim meuTipo As Type
Dim meuCampo As FieldInfo
" Recupera o Tipo Desejado
meuTipo = GetType(Usuario)
" Recupera o Field (_Nome)
meuCampo = meuTipo.GetField("_Nome")
Fields não Públicos
Na maioria das situações do dia a dia os Fields não serão públicos, na verdade é muito estranho se encontrar Fields públicos, então, como Recuperar os Fields Privados?
C#
// Cria Objetos
Type meuTipo;
FieldInfo meuCampoPrivado;
FieldInfo[] meusCamposPrivados;
// Recupera o Tipo Desejado
meuTipo = typeof(Usuario);
// Recupera Todos os Campos Privados
meusCamposPrivados = meuTipo.GetFields(BindingFlags.NonPublic | BindingFlags.Instance);
// Recupera o Campo (_Nome) Privado
meuCampoPrivado = meuTipo.GetField("_Nome", BindingFlags.NonPublic | BindingFlags.Instance);
VB.Net
" Cria Objetos
Dim meuTipo As Type
Dim meuCampoPrivado As FieldInfo
Dim meusCamposPrivados As FieldInfo()
" Recupera o Tipo Desejado
meuTipo = GetType(Usuario)
" Recupera Todos os Campos Privados
meusCamposPrivados = meuTipo.GetFields(BindingFlags.NonPublic Or BindingFlags.Instance)
" Recupera o Campo (_Nome) Privado
meuCampoPrivado = meuTipo.GetField("_Nome", BindingFlags.NonPublic Or BindingFlags.Instance)
Alterando o Valor de um Field
Para alterar o valor de um Field utilizaremos o método (SetValue) do Tipo que contém 2 parâmetros:
- A instância do objeto que queremos alterar o valor do Field;
- O novo valor do Field;
C#
// Cria Objetos
Type meuTipo;
FieldInfo meuCampoPrivado;
Usuario meuUsuario = new Usuario();
// Recupera o Tipo Desejado
meuTipo = typeof(Usuario);
// Recupera o Campo (_Nome) Privado
meuCampoPrivado = meuTipo.GetField("_Nome", BindingFlags.NonPublic | BindingFlags.Instance);
// Alterando o Valor do Field
meuCampoPrivado.SetValue(meuUsuario, "Guilherme Bacellar Moralez");
VB.Net
" Cria Objetos
Dim meuTipo As Type
Dim meuCampoPrivado As FieldInfo
Dim meuUsuario As New Usuario
" Recupera o Tipo Desejado
meuTipo = GetType(Usuario)
" Recupera o Campo (_Nome) Privado
meuCampoPrivado = meuTipo.GetField("_Nome", BindingFlags.NonPublic Or BindingFlags.Instance)
" Altera o Valor do Field
meuCampoPrivado.SetValue(meuUsuario, "Guilherme Bacellar Moralez")
Note que após a execução do método (SetValue) o Field do objeto Usuario conterá a string “Guilherme Bacellar Moralez”.
Recuperando o Valor de um Field
Igualmente podemos recuperar o valor do Field com o método (GetValue) que recebe apenas um único parâmetro:
- A Instância do Objeto que contém o Field que se deseja recuperar;
C#
// Cria Objetos
Type meuTipo;
FieldInfo meuCampoPrivado;
Usuario meuUsuario = new Usuario();
string nomeDoUsuario;
// Recupera o Tipo Desejado
meuTipo = typeof(Usuario);
// Recupera o Campo (_Nome) Privado
meuCampoPrivado = meuTipo.GetField("_Nome", BindingFlags.NonPublic | BindingFlags.Instance);
// Alterando o Valor do Field
meuCampoPrivado.SetValue(meuUsuario, "Guilherme Bacellar Moralez");
// Recupera o Valor do Field
nomeDoUsuario = (string) meuCampoPrivado.GetValue(meuUsuario);
VB.Net
" Cria Objetos
Dim meuTipo As Type
Dim meuCampoPrivado As FieldInfo
Dim meuUsuario As New Usuario
Dim nomeDoUsuario As String
" Recupera o Tipo Desejado
meuTipo = GetType(Usuario)
" Recupera o Campo (_Nome) Privado
meuCampoPrivado = meuTipo.GetField("_Nome", BindingFlags.NonPublic Or BindingFlags.Instance)
" Altera o Valor do Field
meuCampoPrivado.SetValue(meuUsuario, "Guilherme Bacellar Moralez")
" Recupera o Valor do Field
nomeDoUsuario = CStr(meuCampoPrivado.GetValue(meuUsuario))
Observe que o método (GetValue) retorna sempre o conteúdo do Field como um tipo Objeto, então, você sempre terá que realizar uma conversão (Cast) para o tipo da variável desejada (em nosso exemplo é String).
De Fields é só,
Até o próximo artigo sobre Reflexão em que vou falar de Propriedades.