Pues bien, hoy compiier genera tipos anónimos como clases genéricas y sellado. Una combinación paradójica ya que la especialización de una clase genérica es un tipo de herencia, ¿no es así? Para que pueda verificar esto: 1. ¿Es este un tipo genérico? Sí => 2) ¿está su definición sellada & & no es pública? Sí => 3) ¿su definición tiene el atributo CompilerGeneratedAttribute? Supongo que si estos 3 criterios son ciertos, tenemos un tipo anónimo ... Bueno ... Existe un problema con CUALQUIERA de los métodos descritos: son aspectos de uso que pueden cambiar en las próximas versiones de .NET y será así hasta que Microsoft agregue la propiedad booleana IsAnonymous a la clase Type. Espero que va a pasar antes de que todos morimos ... Hasta ese día, se puede comprobar de esta manera:
using System.Runtime.CompilerServices;
using System.Reflection;
public static class AnonymousTypesSupport
{
public static bool IsAnonymous(this Type type)
{
if (type.IsGenericType)
{
var d = type.GetGenericTypeDefinition();
if (d.IsClass && d.IsSealed && d.Attributes.HasFlag(TypeAttributes.NotPublic))
{
var attributes = d.GetCustomAttributes(typeof(CompilerGeneratedAttribute), false);
if (attributes != null && attributes.Length > 0)
{
//WOW! We have an anonymous type!!!
return true;
}
}
}
return false;
}
public static bool IsAnonymousType<T>(this T instance)
{
return IsAnonymous(instance.GetType());
}
}
fuente de http://jclaes.blogspot.com/2011/05/checking-for-anonymous-types.html – serhio
Lamentablemente esto es falso para 'new {}. GetType()' Pero creo que '&& type. IsGenericType' puede salvarse de forma segura. –
Parece que necesita '(type.Name.Contains (" AnonymousType ") || type.Name.Contains (" AnonType "))' para ser compatible con Mono. Fuente: [Método de extensión de NancyFx] (https://github.com/NancyFx/Nancy/blob/master/src/Nancy/ViewEngines/Extensions.cs) –