type new initialize anonimas c# anonymous-types

new - return anonymous type c#



¿Cómo acceder a la propiedad de tipo anónimo en C#? (3)

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

Vea esta publicación en el blog: http://blogs.msdn.com/wriju/archive/2007/10/26/c-3-0-anonymous-type-and-net-reflection-hand-in-hand.aspx

Entonces algo así 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!"); } }

Tengo esto:

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

... y me pregunto si puedo tomar la propiedad "Comprobado" 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


Si desea una lista fuertemente tipada de tipos anónimos, también deberá hacer que la lista sea de tipo anónimo. La forma más fácil de hacerlo es proyectar una secuencia como una matriz en una lista, por ejemplo

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

Entonces podrás acceder a ella como:

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

Debido a la forma en que funciona el compilador, lo siguiente también debería funcionar una vez que haya creado la lista, porque 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 */ });


Si está almacenando el objeto como tipo de object , necesita usar el reflejo. 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, busca una propiedad:

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

Entonces de eso puedes obtener un valor:

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

Esta respuesta ya hace tiempo que debería haber una actualización para 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 al usar ?. ¡causamos que el v resultante sea null en tres situaciones diferentes!

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

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