2009-10-30 20 views

Respuesta

35

A pesar de que un tipo anónimo es un tipo ordinario, puede utilizar algunas heurísticas:

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; 
    } 
} 

Otra buena heurística que se utilizará es si el nombre de la clase es un nombre válido de C# (tipo anónimo se generan sin nombres válidos de clase C# - use expresión regular para esto).

+1

+ 1 Buena respuesta. –

+0

@Philip pero no a prueba de tontos, vea esta pregunta. –

+1

@MattWarren, ¿cuál es la pregunta? –

2

En methadata y CLR no existen términos como tipos anónimos. Los tipos anónimos son únicamente la función de compilación.

1

Puede ser útil saber por qué quiere saber esto. Si se ejecuta el siguiente:

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

... que se vería algo así como "<> f__AnonymousType0`1" salida como el nombre del tipo. Dependiendo de sus requisitos, puede suponer que un tipo que comienza con <>, que contiene "Tipo anónimo" y un carácter de comillas atrás es lo que está buscando.

+0

No se preocupe por qué. Es curiosidad :) – xyz

+0

Pensé lo mismo, pero está un poco sucio. ¿Qué pasa si cambian el nombre en C# 5? Cualquier código que lo use se romperá. –

+0

Es importante preguntar y explicar "por qué" porque a menudo hay otras respuestas posibles que pueden no ser evidentes a partir de la pregunta sin saber más. –

1

Parece que los tipos anónimos obtienen un DebuggerDisplayAttribute puesto en ellos donde Type = "<Anonymous Type>".

Editar: Pero solo cuando se compila en modo Depuración. Maldito.

+0

¿En la compilación de versiones también? –

5

No hay construcción de lenguaje C# que le permita decir "¿Es este un tipo anónimo". Puede usar una heurística simple para aproximar si un tipo es de tipo anónimo, pero es posible que lo engañe la codificación manual IL, o el uso de un lenguaje donde los caracteres > y < son válidos en los identificadores.

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

propiedades de un objeto con tipo anónimo

  • tiene un espacio de nombres iguales a null
  • tipo base de System.Object
  • IsSealed = true
  • atributo personalizado es 0 DebuggerDisplayAttribute, Tipo : ""
  • IsPublic = falso

Para mi aplicación particular, si el espacio de nombres es nulo, se puede deducir que el tipo es anónimo, por lo que comprobar que el espacio de nombres sea nulo es probablemente el cheque menos costoso.

+1

Gracias, optando por el tipo de devolución.NameSpace == null; mejoré el procesamiento de mis programas en casi un 50% (estaba usando este enfoque: http://stackoverflow.com/questions/2483023/how-to-test-if-a-type-is-anonymous) – Schalk

+0

Sí. Esta debería ser la respuesta correcta. No creo que ninguna clase concreta razonable tenga un espacio de nombres nulo. –

+0

+1 ¡gracias! Dejando aquí mi comentario para preferir esta respuesta (no solo un hilo) –

Cuestiones relacionadas