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 Moralez



Os 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:

  1. A instância do objeto que queremos alterar o valor do Field;
  2. 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:

  1. 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.

Guilherme Bacellar Moralez

Guilherme Bacellar Moralez - Bacharel em Ciências da Computação, Desenvolvedor .NET há 4 anos, MCAD, Autor de Livros e Artigos, Arquiteto de Software do Projeto D.NET (Framework de Desenvolvimento .NET).
Blog:
http://dotnetmax.bacellar.org/