19 de out. de 2004

Como usar Reflection para manipular as propriedades de um objeto em C#?

Usando Reflection, é possível manipular as propriedades de um objeto da maneira que você quiser.

Listar as Propriedades de um Objeto

O exemplo seguinte ilustra como acessar as propriedades públicas de um objeto. A chave para isso é o objeto PropertyInfo.
1 using System.Reflection; 2 3 public static void ListarPropriedades(object o) { 4 5 Type t = o.GetType(); 6 7 foreach (PropertyInfo pi in t.GetProperties()) { 8 9 Console.WriteLine(string.Format("{0} {1}", 10 pi.PropertyType.FullName, pi.Name)); 11 } 12 }

Obter o Valor das Propriedades de um Objeto

O exemplo seguinte ilustra como obter os valores das propriedades públicas de um objeto.
1 using System.Reflection; 2 3 public static void ListarValores(object o) { 4 5 Type t = o.GetType(); 6 7 foreach (PropertyInfo pi in t.GetProperties()) { 8 9 Console.WriteLine(string.Format("{0} {1} = {2}", 10 pi.PropertyType.FullName, pi.Name, 11 pi.GetValue(o, null))); 12 } 13 }

Alterar o Valor das Propriedades de um Objeto

O exemplo seguinte é ligeiramente diferente dos anteriores. Ele ilustra como alterar o valor de uma determinada propriedade pública de um objeto.
1 using System.Reflection; 2 3 public static void AlterarValor(object o, 4 string propriedade, object valor) { 5 6 Type t = o.GetType(); 7 8 foreach (PropertyInfo pi in t.GetProperties()) { 9 10 if (pi.Name.Equals(propriedade)) { 11 12 pi.SetValue(o, valor, null); 13 break; 14 } 15 } 16 }

Note que AlterarValor() pode receber qualquer objeto como argumento, independente do objeto possuir ou não a propriedade desejada; se o objeto possuir a propriedade, o valor dela será ajustado para o valor fornecido.

Outro ponto: como o valor é passado como um object, dependendo como o argumento é passado, existe uma penalidade envolvida que é o boxing do argumento.

Nenhum comentário: