2009-07-17 11 views
9

necesito para detectar si un objeto se creó de forma anónima como nuevo {nombre = valor,}C# Detección AnonymousType nueva {nombre = valor,} y se convierten en Dictionary <string, object>

si es un AnonymousType, se debe añadir sus propiedades nombres/valores en un

Dictionary<string,object> 

Esto es lo que han pirateado junto a mí mismo:

var name="name"; 

var obj = new { name = new object(), }; 

var lookup = new Dictionary<string,object>(); 


if(obj.GetType().Name.StartsWith("<>f__AnonymousType")) 
{ 
    foreach (var property in obj.GetType().GetProperties()) 
    { 
     lookup[property.Name] = property.GetValue(obj, null); 
    } 
} 
else 
{ 
    lookup[name]=obj; 
} 

me preguntaba si hay una manera mejor/más rápido de detectar AnonymousTypes, o si hay una manera mejor/más rápido para volcar los nombres de propiedades de un objeto/valores en un

Dictionary<string,object> 
+0

¿Qué estás tratando de lograr con esto? Sea lo que sea, debe haber una mejor manera de hacerlo. –

Respuesta

24

Para obtener todas las propiedades de un objeto, con sus valores en Dictionary, puede acoplar la potencia de Linq a Objetos con reflexión.

Puede utilizar el método Enumerable.ToDictionary:

var dic = obj.GetType() 
      .GetProperties() 
      .ToDictionary(p => p.Name, p=> p.GetValue(obj, null)); 

Esto le devolverá un Dictionary<string, object>.

+0

El problema es que si puede usar el diccionario en primer lugar, sería enormemente más rápido a menos que Linq esté haciendo un caché loco en esa consulta, en cuyo caso sería "solo" considerablemente más rápido. –

+0

¿Qué sucede si veo propiedades "intrínsecas" como "GenericEqualityComparer", en lugar de las propiedades que declaro explícitamente? Intenté 'GetProperties (BindingFlags.DeclaredOnly)'. – drzaus

+0

raro, no importa: descubrí que el método que usaba esta reflexión (en sí mismo en una extensión de objeto) terminaba llamándose a sí mismo con el resultado convertido, por lo que mi extensión se llamaba a un objeto Y LUEGO al diccionario resultante. – drzaus

6

utilizar la nueva sintaxis de inicializador de colección de objetos en lugar de un tipo anónimo:

var obj = new Dictionary<string, object>() 
{ 
    { "Name", t.Name }, 
    { "Value", t.Value } 
}; 
2

La detección de un anónimo tipo es un poco difícil; ¡no menos importante, depende del idioma! Los tipos anónimos de VB no tienen el mismo aspecto que los tipos anónimos de C#. Sería dudoso acerca de la lógica de que los actos varían de manera diferente en los tipos anónimos. Puede consultar [CompilerGenerated], pero tenga en cuenta que no solo significa "tipo anónimo", sino que hay otros que lo hacen.

Personalmente, no me gustaría distinguir en este escenario.

Cuestiones relacionadas