Question

J'ai un générique < > fonction qui prend une requête linq ('items') et énumère à travers elle en ajoutant des propriétés supplémentaires. Comment sélectionner toutes les propriétés de "l'élément" d'origine plutôt que de l'élément lui-même (comme le code ci-dessous)?

Donc équivalent au sql: sélectionnez *, 'bar' comme Foo parmi les éléments

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);
}
Était-ce utile?

La solution

Il n’est pas facile de faire ce que vous suggérez, car tous les types en C # sont fortement typés, même les types anonymes comme ceux que vous utilisez. Cependant, il n'est pas impossible d'y parvenir. Pour ce faire, vous devez utiliser la réflexion et émettre votre propre assemblage en mémoire, en ajoutant un nouveau module et un type contenant les propriétés spécifiques souhaitées. Il est possible d'obtenir une liste de propriétés de votre élément anonyme à l'aide de:

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

Autres conseils

Shoot, vous avez écrit exactement ce que j'allais publier. Je préparais juste du code: /

C'est un peu compliqué mais quand même:

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
};

Demandez à l'objet de vous le donner.

La réflexion est un moyen ... Cependant, comme toutes les propriétés sont connues au moment de la compilation, chaque élément peut avoir une méthode qui aide cette requête à obtenir ce dont elle a besoin.

Voici quelques exemples de signatures de méthodes:

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

Supposons que vous ayez une collection de classes de département:

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

Utilisez ensuite un type anonyme comme ceci:

        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" };
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top