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.