public
Created

Extension method to get the underlying Entity-type of an NHibernate Proxy (or Entity)

  • Download Gist
EntityTypeExtension.cs
C#
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
/*
 
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;
}
}

Please sign in to comment on this gist.

Something went wrong with that request. Please try again.