Метод Диего полностью загружает объект, прежде чем пытаться определить его тип - это, безусловно, наиболее общий подход, но вам может не потребоваться загрузка объекта, если конкретный тип уже известен Прокси.
Метод Виджая быстрее в тех случаях, когда конкретный тип известен заранее - но, как указал Диего, в некоторых случаях эта информация недоступна, поскольку информация, необходимая для определения точного типа, еще не была загружена.
Принимая во внимание оба сценария, я придумал следующее:
https://gist.github.com/1089489
Интересная вещь такова:
if (entity is INHibernateProxy)
{
var lazyInitialiser = ((INHibernateProxy)entity).HibernateLazyInitializer;
var type = lazyInitialiser.PersistentClass;
if (type.IsAbstract || type.GetNestedTypes().Length > 0)
return Service.Session.GetSessionImplementation().PersistenceContext.Unproxy(entity).GetType();
else // we don't need to "unbox" the Proxy-object to get the type
return lazyInitialiser.PersistentClass;
}
return entity.GetType();
Сначала проверяется, является ли тип прокси абстрактным, и использует метод Виджая или Диего, в зависимости от того, известен ли конкретный тип.
Другими словами, он загружает объект только в том случае, если тип за прокси-сервером не является конкретным типом или может иметь подтип.
Я провел быстрый модульный тест, чтобы продемонстрировать, что это работает, но я не думаю, что проверил все возможные случаи - я считаю, что идея правильная, но я хотел бы услышать комментарии Диего и Виджая, или других .
Спасибо!
РЕДАКТИРОВАТЬ: выложил обновление в суть выше, с дополнительным универсальным методом, который может быть использован для Unproxy () сущности - в некоторых случаях вам, возможно, придется сделать это ...