Pregunta

Tengo un genérico<> función que toma una consulta linq ('elementos') y enumera que la adición de propiedades adicionales.¿Cómo puedo seleccionar todas las propiedades de la original 'item' en lugar del elemento en sí (como en el código siguiente se hace)?

De manera equivalente a la de sql:select *, 'bar' como Foo de los elementos

foreach (var item in items)
{
    var newItem = new {
        item, // I'd like just the properties here, not the 'item' object!
        Foo = "bar"
    };

    newItems.Add(newItem);
}
¿Fue útil?

Solución

No hay una manera fácil de hacer de lo que usted está sugiriendo, como todos los tipos en C# son fuertemente tipado, incluso los anónimos como en el caso de que estés usando.Sin embargo no es imposible arrancarlo.Para hacer esto usted tendría que utilizar la reflexión y emiten su propia asamblea en la memoria, la adición de un nuevo módulo y escriba que contiene las propiedades específicas que usted desea.Es posible obtener una lista de propiedades de su anónimos artículo con:

foreach(PropertyInfo info in item.GetType().GetProperties())
    Console.WriteLine("{0} = {1}", info.Name, info.GetValue(item, null));

Otros consejos

Disparar escribió exactamente lo que yo iba a publicar.Me estaba empezando algo de código listo :/

Es un poco complicado pero de todos modos:

ClientCollection coll = new ClientCollection();
var results = coll.Select(c =>
{
    Dictionary<string, object> objlist = new Dictionary<string, object>();
    foreach (PropertyInfo pi in c.GetType().GetProperties())
    {
        objlist.Add(pi.Name, pi.GetValue(c, null));
    }
    return new { someproperty = 1, propertyValues = objlist };
});
from item in items
where someConditionOnItem
select
{
     propertyOne,
     propertyTwo
};

Pedir el elemento para darles a ustedes.

La reflexión es una forma de...sin embargo, ya que todas las propiedades son conocidos en tiempo de compilación, cada elemento puede tener un método que ayuda a que esta consulta de obtener lo que necesita.

He aquí un ejemplo de método de firmas:

public XElement ToXElement()
public IEnumerable ToPropertyEnumerable()
public Dictionary<string, object> ToNameValuePairs()

Supongamos que usted tiene una colección de Departamento de la clase:

   public int DepartmentId { get; set; }
   public string DepartmentName { get; set; }

A continuación, utilice el tipo anónimo como este:

        List<DepartMent> depList = new List<DepartMent>();
        depList.Add(new DepartMent { DepartmentId = 1, DepartmentName = "Finance" });
        depList.Add(new DepartMent { DepartmentId = 2, DepartmentName = "HR" });
        depList.Add(new DepartMent { DepartmentId = 3, DepartmentName = "IT" });
        depList.Add(new DepartMent { DepartmentId = 4, DepartmentName = "Admin" });
        var result = from b in depList
                     select new {Id=b.DepartmentId,Damartment=b.DepartmentName,Foo="bar" };
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top