2009-07-29 21 views
81

tengo esto:¿Cómo acceder a la propiedad de tipo anónimo en C#?

List<object> nodes = new List<object>(); 

nodes.Add(
new { 
    Checked  = false, 
    depth  = 1, 
    id   = "div_" + d.Id 
}); 

... y me pregunto si entonces puedo agarrar la propiedad "cuadros" del objeto anónimo. No estoy seguro de si esto es posible. Intenté hacer esto:

if (nodes.Any(n => n["Checked"] == false)) ... pero no funciona.

Gracias

Respuesta

52

Si desea una lista con establecimiento inflexible de tipos anónimos, que tendrá que hacer la lista de un tipo anónimo también. La forma más fácil de hacerlo es proyectar una secuencia como una matriz en una lista, p.

var nodes = (new[] { new { Checked = false, /* etc */ } }).ToList(); 

Entonces serás capaz de acceder a ella como:

nodes.Any(n => n.Checked); 

Debido a la forma en que funciona el compilador, a continuación, el siguiente también debería funcionar una vez que se haya creado la lista, debido a que los tipos anónimos tienen la misma estructura, por lo que también son del mismo tipo. No tengo un compilador a mano para verificar esto sin embargo.

nodes.Add(new { Checked = false, /* etc */ }); 
200

Si va a almacenar el objeto como tipo object, es necesario utilizar la reflexión. Esto es cierto para cualquier tipo de objeto, anónimo o no. En un objeto O, puede obtener su tipo:

Type t = o.GetType(); 

Luego de eso se mira una propiedad:

PropertyInfo p = t.GetProperty("Foo"); 

Luego de que se puede obtener un valor:

object v = p.GetValue(o, null); 

Esta respuesta ha sido retrasada hace mucho tiempo para una actualización de C# 4:

dynamic d = o; 
object v = d.Foo; 

Y ahora otra alternativa en C# 6:

object v = o?.GetType().GetProperty("Foo")?.GetValue(o, null); 

Tenga en cuenta que mediante el uso de ?. hacemos que la v el resultado es null en tres situaciones diferentes!

  1. o es null, por lo que no hay ningún objeto en absoluto
  2. o es no- null pero no tiene una propiedad Foo
  3. o tiene una propiedad Foo pero su valor real pasa a ser null.

Esto no es equivalente a los ejemplos anteriores, pero puede tener sentido si desea tratar los tres casos de la misma manera.

+4

nunca utilizó una dinámica antes hasta ahora, buena actualización para .NET 4.0 – Alan

+1

woow, bueno para C# 4 = D este trabajo para mí – ch2o

+0

en la solución C# 4 obtendrá la excepción de tiempo de ejecución si la propiedad no existe ('objeto v = d.Foo'), mientras que' GetValue (o, null) 'será nula si no existe. – kobe

12

Puede iterar sobre las propiedades del tipo anónimo usando Reflection; ver si hay una propiedad "Controlada" y si hay entonces obtener su valor.

Ver esta entrada del blog: http://blogs.msdn.com/wriju/archive/2007/10/26/c-3-0-anonymous-type-and-net-reflection-hand-in-hand.aspx

Así que algo como:

foreach(object o in nodes) 
{ 
    Type t = o.GetType(); 

    PropertyInfo[] pi = t.GetProperties(); 

    foreach (PropertyInfo p in pi) 
    { 
     if (p.Name=="Checked" && !(bool)p.GetValue(o)) 
      Console.WriteLine("awesome!"); 
    } 
} 
+4

Si solo necesita una propiedad y ya sabe su nombre, no tiene sentido examinarlas todas; solo use GetProperty y GetValue. Además, System.out.println es Java, no C# ... –

+0

Vaya, ¡así es, Chris! Un poco embarazoso ... arreglado ahora. – glennkentwell

Cuestiones relacionadas