Question

    

Cette question a déjà une réponse ici:

         

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

Était-ce utile?

La solution

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 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 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).

Autres conseils

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

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

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

Il n'y a pas de construction en langage C # qui vous permet 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 & Gt; et < sont valables 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;
}

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

Il pourrait ê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 verriez quelque chose comme & "; < > f__AnonymousType0`1 &"; sortie comme nom de type. Selon vos besoins, vous pourrez peut-être supposer qu'un type commençant par & Lt; & Gt ;, contenant & "AnonymousType &"; et un caractère de citation en arrière est ce que vous recherchez.

Il semble que les types anonymes reçoivent un DebuggerDisplayAttribute texte où Type = "<Anonymous Type>".

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top