Pequena pausa na série. Programando hoje, apanhei tristemente de uma coisa ultra simples. Estava aprimorando o meu gerador de forms dinâmicos na parte de carga de dados do post. A partir dos parâmetros trazidos, ele preenche a instância do objeto desejado, salvando automaticamente se necessário.
Imaginem um objeto com uma prorpriedade value qualquer (Id p. ex, que é Int32). Como o dynamic form preenche cada propriedade por reflection, no final eu tenho sempre dois objetcs. Algo tipo assim:
object oldValue = myOldObject.Id;
object newValue = myNewObject.Id;
Só que quando eu comparo (oldValue == newValue) ele retorna sempre false, mesmo que o Id seja o mesmo! Óbvio, por causa do boxing, no == ele compara as referências e aí como não é o mesmo objeto, sempre retorna false. O que não foi tão óbvio foi como sair desta encrenca já que, em tese, eu deveria fazer o unboxing primeiro, só que como eu só tenho o type por reflection, isto não seria fácil.
Depois de perder quase meia hora e já pensando no pior, achei um post sobre o System.Object.Equal. Ele faz a comparação do conteúdo e aí funciona para value types. Aí o código fica simplesmente:
System.Object.Equal(oldValue, newValue)
Simples, certo? Mas não óbvio e resolvi postar aqui pra facilitar a vida de outras pessoas que tenham a mesma dificuldade!
Até breve!