Eh bien, aujourd'hui compiier génère des types anonymes comme des classes génériques ET scellées. Une combinaison paradoxale puisque la spécialisation d'une classe générique est une sorte d'héritage, n'est-ce pas ? Vous pouvez donc vérifier cela : 1. Est-ce un type générique ? Oui => 2) sa définition est-elle scellée && non publique ? Oui => 3) sa définition possède-t-elle l'attribut CompilerGeneratedAttribute ? Je suppose que si ces 3 critères sont vrais ensemble, nous avons un type anonyme... Et bien... Il y a un problème avec TOUTES les méthodes décrites - ce sont des aspects d'utilisation qui peuvent changer dans les prochaines versions de .NET et il en sera ainsi jusqu'à ce que Microsoft ajoute la propriété booléenne IsAnonymous à la classe Type. J'espère que cela arrivera avant que nous mourions tous... Jusqu'à ce jour, il peut être vérifié comme suit :
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());
}
}