Déterminer si un type est un type anonyme

En C # 3.0, est-il possible de déterminer si une instance de Type représente un type anonyme?

Même si un type anonyme est un type ordinaire, vous pouvez utiliser certaines heuristiques:

 public static class TypeExtension { public static Boolean IsAnonymousType(this Type type) { Boolean hasComstackrGeneratedAtsortingbute = type.GetCustomAtsortingbutes(typeof(ComstackrGeneratedAtsortingbute), false).Count() > 0; Boolean nameContainsAnonymousType = type.FullName.Contains("AnonymousType"); Boolean isAnonymousType = hasComstackrGeneratedAtsortingbute && nameContainsAnonymousType; return isAnonymousType; } } 

Une autre bonne heuristique à utiliser est si le nom de la classe est un nom C # valide (les types anonymes sont générés sans noms de classe C # valides – utilisez une expression régulière pour cela).

Propriétés d’un object typé anonyme

  • a un espace de noms égal à null
  • type de base de System.Object
  • IsSealed = true
  • L’atsortingbut personnalisé 0 est DebuggerDisplayAtsortingbute, Type: “”
  • IsPublic = false

Pour mon application particulière, si l’espace de noms est nul, il est possible d’en déduire que le type est anonyme. Par conséquent, vérifier que l’espace de noms est nul est probablement la vérification la moins chère.

Il n’y a pas de construction en langage C # permettant de dire “Est-ce un type anonyme”. Vous pouvez utiliser une heuristique simple pour déterminer si un type est un type anonyme, mais il est possible de se faire avoir par du code IL, ou en utilisant un langage dans lequel des caractères tels que> et

 public static class TypeExtensions { public static bool IsAnonymousType(this Type t) { var name = t.Name; if ( name.Length < 3 ) { return false; } return name[0] == '<' && name[1] == '>' && name.IndexOf("AnonymousType", SsortingngComparison.Ordinal) > 0; } 

Dans les méthadonnées et CLR, il n’existe pas de termes tels que les types anonymes. Les types anonymes sont uniquement des fonctionnalités du compilateur.

Peut-être utile de savoir pourquoi vous voulez savoir cela. Si vous exécutez ce qui suit:

 var myType = new { Name = "Bill" }; Console.Write( myType.GetType().Name ); 

… vous verrez quelque chose comme “<> f__AnonymousType0`1″ en sortie sous le nom du type. En fonction de vos besoins, vous pourrez peut-être supposer qu’un type commençant par <>, contenant “AnonymousType” et un caractère de guillemet inversé est ce que vous recherchez.

Il semble que les types anonymes reçoivent un DebuggerDisplayAtsortingbuteType = "" .

Edit: Mais seulement lorsque vous comstackz en mode Debug. Zut.