2009-10-30 10 views

Répondre

35

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

public static class TypeExtension { 

    public static Boolean IsAnonymousType(this Type type) { 
     Boolean hasCompilerGeneratedAttribute = type.GetCustomAttributes(typeof(CompilerGeneratedAttribute), false).Count() > 0; 
     Boolean nameContainsAnonymousType = type.FullName.Contains("AnonymousType"); 
     Boolean isAnonymousType = hasCompilerGeneratedAttribute && nameContainsAnonymousType; 

     return isAnonymousType; 
    } 
} 

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

+1

+ 1 Bonne réponse. –

+0

@Philip mais pas infaillible, voir cette question. –

+1

@MattWarren, quelle question? –

2

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

1

Peut-être utile de savoir pourquoi vous voulez le savoir. Si vous exécutez la commande suivante:

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

... vous verriez quelque chose comme « <> f__AnonymousType0`1 » sortie comme le nom du type. Selon vos besoins, vous pouvez supposer qu'un type commençant par <>, contenant "AnonymousType" et un caractère de guillemet arrière est ce que vous cherchez.

+0

Ne vous inquiétez pas pourquoi. C'est de la curiosité :) – xyz

+0

J'ai pensé la même chose, mais c'est un peu sale. Et s'ils changeaient le nom dans C# 5? Tout code qui l'utilise sera cassé. –

+0

Il est important de demander et d'expliquer «pourquoi» parce que souvent il y a d'autres réponses possibles qui peuvent ne pas être évidentes à partir de la question sans en savoir plus. –

1

Il semble que les types anonymes obtiennent un DebuggerDisplayAttribute mis sur eux où Type = "<Anonymous Type>".

Éditer: Mais seulement lorsque vous compilez en mode débogage. Zut.

+0

Dans la version de construction aussi? –

5

Il n'y a pas de construction de langage C# qui vous permet de dire "Est-ce un type anonyme". Vous pouvez utiliser une heuristique simple pour estimer si un type est un type anonyme, mais il est possible de se faire piéger par des gens qui codent IL, ou en utilisant un langage où des caractères tels que > et < sont valides dans les identifiants.

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", StringComparison.Ordinal) > 0; 
} 
14

propriétés d'un objet typé anonyme

  • a un espace de noms égal à null
  • type de base
  • de System.Object
  • IsSealed = true
  • attribut personnalisé 0 est DebuggerDisplayAttribute, type : ""
  • IsPublic = false

Pour mon application particulière, si l'espace de noms est nul, on peut déduire que le type est anonyme, donc vérifier que l'espace de noms est nul est probablement la vérification la moins chère.

+1

Merci, en optant pour le type de retour. NameSpace == null; amélioré le traitement de mes programmes de près de 50% (utilisait cette approche: http://stackoverflow.com/questions/2483023/how-to-test-if-a-type-is-anonymous) – Schalk

+0

Ouais. Cela devrait être la bonne réponse. Je ne pense pas que n'importe quelle classe concrète raisonnable aurait jamais un espace de noms nul. –

+0

+1 merci! Laissant ici mon commentaire afin de préférer cette réponse (pas seulement un fil) –

Questions connexes