Skip to content

Instantly share code, notes, and snippets.

@mindplay-dk
Created July 18, 2011 13:20
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mindplay-dk/1089489 to your computer and use it in GitHub Desktop.
Save mindplay-dk/1089489 to your computer and use it in GitHub Desktop.
Extension method to get the underlying Entity-type of an NHibernate Proxy (or Entity)
/*
This code assumes an IEntity interface that identifies your persistent types.
*/
/// <summary>
/// This static class provides common extension methods for <see cref="IEntity"/> types.
/// </summary>
public static class EntityExtensions
{
/// <summary>
/// Gets the real, underlying Entity-type - as opposed to the standard GetType() method,
/// this method takes into account the possibility that the object may in fact be an
/// NHibernate Proxy object, and not a real object. This method will return the real
/// Entity-type, doing a full initialization if necessary.
/// </summary>
public static Type GetEntityType(this IEntity entity)
{
if (entity is INHibernateProxy)
{
var lazyInitialiser = ((INHibernateProxy)entity).HibernateLazyInitializer;
var type = lazyInitialiser.PersistentClass;
if (type.IsAbstract || type.GetNestedTypes().Length > 0)
return Unproxy(entity).GetType();
else // we don't need to "unbox" the Proxy-object to get the type
return lazyInitialiser.PersistentClass;
}
return entity.GetType();
}
/// <summary>
/// Based on the real, underlying Entity-type, this method returns true if the specified
/// type matches (or is assignable from) the specified Type.
/// </summary>
public static bool Is<TEntity>(this IEntity entity)
where TEntity : class, IEntity
{
var entityType = entity.GetEntityType();
var type = typeof (TEntity);
return entityType == type || type.IsAssignableFrom(entityType);
}
/// <summary>
/// In some cases, you may need the actual object, not just the type - for example, if
/// you're going to cast to a type deeper in the hierarchy, you may need to Unproxy
/// the object first.
/// </summary>
public static TEntity Unproxy<TEntity>(this TEntity entity)
where TEntity : class, IEntity
{
return entity is INHibernateProxy
? (TEntity) Service.Session.GetSessionImplementation().PersistenceContext.Unproxy(entity)
: entity;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment