En C# 3.0, ¿es posible determinar si una instancia de Type
representa un tipo anónimo?Determinar si un tipo es un tipo anónimo
Respuesta
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 Buena respuesta. –
@Philip pero no a prueba de tontos, vea esta pregunta. –
@MattWarren, ¿cuál es la pregunta? –
En methadata y CLR no existen términos como tipos anónimos. Los tipos anónimos son únicamente la función de compilación.
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.
No se preocupe por qué. Es curiosidad :) – xyz
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á. –
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. –
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.
¿En la compilación de versiones también? –
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;
}
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.
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
Sí. Esta debería ser la respuesta correcta. No creo que ninguna clase concreta razonable tenga un espacio de nombres nulo. –
+1 ¡gracias! Dejando aquí mi comentario para preferir esta respuesta (no solo un hilo) –
- 1. ¿Cómo probar si un tipo es anónimo?
- 2. ¿Cómo determinar si un tipo es un tipo de colección?
- 3. ¿Es posible determinar si un tipo es un tipo de enumeración con ámbito?
- 4. ¿Crear un tipo anónimo dinámicamente?
- 5. ¿Cómo determinar si un tipo .NET es una estructura personalizada?
- 6. Cómo determinar si una excepción es de un tipo particular
- 7. es posible tener un campo condicional en un tipo anónimo
- 8. ¿Cómo puedo determinar si System.Type es un tipo personalizado o un tipo de Framework?
- 9. ¿Puede un tipo anónimo heredar de otro tipo?
- 10. Determine si un tipo es estático
- 11. ¿Es posible enlazar datos usando un tipo anónimo?
- 12. Transmitido a tipo anónimo
- 13. cómo determinar si un tipo implementa un tipo específico interfaz genérica
- 14. Tipo anónimo y tupla
- 15. ¿Cómo determinar y verificar si un tipo en el ensamblaje es tipo personalizado o tipo primitivo usando reflexión en .NET?
- 16. ¿Cómo determinar si un parámetro de tipo es un subtipo de un rasgo?
- 17. Detectar si el tipo de un objeto es un tipo definido por .NET Framework
- 18. Emitir un tipo anónimo en Objeto y recuperar un campo
- 19. tipo anónimo y propiedades múltiples
- 20. Determinar si un archivo es un duplicado
- 21. Usando .Net, ¿cómo puedo determinar si un tipo es un ValueType numérico?
- 22. ¿Cómo puedo devolver un tipo anónimo desde un método?
- 23. PowerShell: ¿es posible determinar el tipo MIME de un archivo?
- 24. Convertir Anónimo Tipo de Clase
- 25. al codificar cuál es la forma más rápida de determinar si un tipo es IDisposable
- 26. ¿Hay alguna manera de restringir un parámetro de tipo genérico a un tipo anónimo?
- 27. Determinar dónde se define un tipo
- 28. ¿Cómo verificar si un parámetro de tipo genérico es anulable?
- 29. LINQ, utilice "variable" dentro de un tipo anónimo
- 30. Comprobando si un cierto tipo es un delegado de Acción
Consulte también la respuesta: http://stackoverflow.com/a/315186/46039 –