dica rápida: problema com proxy no nhibernate

13 02 2008

Tive um problema com o NHibernate e suas classes proxy que me levou um bom pedaço da tarde.

Ocorre que eu tenho uma classe “Pessoa” e suas filhas “Fisica” e Juridica”. O que eu queria era listar todas as pessoas, e quando uma fosse escolhida eu tinha que fazer uma ação baseada no seu tipo. Normal.

O problema é que minha consulta retornava objetos “CProxyTypePessoa_NHibernate_ProxyINHibernateProxy_System_Runtime_SerializationISerializable2.

Essa classe herda de “Pessoa”, mas se eu tento fazer o cast pra “Fisica” ou “Juridica” – ban! Exceção.

Depois de fuçar um bucado, achei a solução pra Java:


if (obj instanceof HibernateProxy) {
obj = ((HibernateProxy)obj).getHibernateLazyInitializer().getImplementation();
}

Em .net, ficou quase igual:

if (obj is INHibernateProxy)
{
obj = (Pessoa)NHibernateProxyHelper.GetLazyInitializer(obj as INHibernateProxy).GetImplementation();
}

Bem trivial, mas eu perdi um bom tempo pra achar isso.

ps. Usei a extensão Reflector, pro Visual Studio. Um class browser bem bacana.