Frage

Ich habe eine generische <> Funktion bekommt, die eine Linq-Abfrage ( ‚Artikel‘) nimmt und aufzählt durch sie zusätzliche Eigenschaften hinzufügen. Wie kann ich alle Eigenschaften des ursprünglichen ‚item‘ wählen, anstatt das Element selbst (wie der folgende Code der Fall ist)?

So entsprechen den SQL: select *, 'bar' wie Foo von Artikel

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);
}
War es hilfreich?

Lösung

Es gibt keine einfache Art und Weise zu tun, was Sie vorschlagen, da alle Typen in C # sind stark typisiert, auch die anonymen wie Sie verwenden. Allerdings ist es nicht unmöglich, es auszuziehen. Um es zu tun würden Sie Reflexion nutzen und Ihre eigene Baugruppe im Speicher aussenden, ein neues Modul und geben Sie hinzufügen, die die spezifischen Eigenschaften enthält, die Sie wollen. Es ist möglich, eine Liste der Eigenschaften von Ihrem anonymen Artikel zu erhalten, mit:

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

Andere Tipps

Schießen Sie schreiben genau das, was ich schreiben wollte. Ich war immer nur ein Code bereit: /

Es ist ein wenig verworren, aber sowieso:

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

Stellen Sie das Element sich Ihnen zu geben.

Reflexion ein Weg ist, ... aber, da alle Eigenschaften zum Zeitpunkt der Kompilierung bekannt sind, könnte jedes Element eine Methode, die diese Abfrage hilft zu bekommen, was er braucht.

Hier einige Beispiel Methodensignaturen:

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

Angenommen, Sie eine Sammlung der Abteilung Klasse haben:

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

Verwenden Sie dann anonymen Typ wie folgt:

        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" };
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top