c# - variable - Determinar si un tipo es un tipo anónimo
uso de var en c# (6)
Esta pregunta ya tiene una respuesta aquí:
- Tipos anónimos - ¿Hay características distintivas? 3 respuestas
En C # 3.0, ¿es posible determinar si una instancia de Type
representa un Tipo Anónimo?
Aunque un tipo anónimo es un tipo normal, 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 debe usar es si el nombre de la clase es un nombre de C # válido (los tipos anónimos se generan sin nombres de clase de C # válidos; use la expresión regular para esto).
En metadatos y CLR no hay términos tales como tipos anónimos. Los tipos anónimos son únicamente una característica del compilador.
No hay una construcción de lenguaje C # que le permita decir "¿Es este un tipo anónimo?" Puede usar una heurística simple para aproximarse si un tipo es de tipo anónimo, pero es posible que la gente lo codifique a mano o que use un idioma donde los caracteres como> y <sean 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;
}
Parece que los tipos anónimos obtienen un DebuggerDisplayAttribute
puesto en ellos donde Type = "<Anonymous Type>"
.
Editar: Pero solo cuando compilas en modo Debug. Maldito.
Podría ser útil saber por qué quieres saber esto. Si ejecuta lo siguiente:
var myType = new { Name = "Bill" };
Console.Write( myType.GetType().Name );
... vería algo como la salida "<> f__AnonymousType0`1" como nombre de tipo. Dependiendo de sus requisitos, puede suponer que lo que está buscando es un tipo que comience con <>, que contenga "Tipo de Anónimo" y un carácter de comillas invertidas.
Propiedades de un objeto escrito anónimo
- tiene un espacio de nombres igual a nulo
- tipo base de System.Object
- IsSealed = true
- el atributo personalizado 0 es DebuggerDisplayAttribute, Type: ""
- IsPublic = false
Para mi aplicación en particular, si el espacio de nombres es nulo, se puede inferir que el tipo es anónimo, por lo que verificar que el espacio de nombres sea nulo es probablemente el cheque menos costoso.