Ich habe eine Sammlung von Objekten, die alle einen gemeinsamen Basistyp haben. Diese Objekte werden auf vielen verschiedenen Ebenen abgeleitet und alle Eigenschaften stammen aus der Implementierung von Schnittstellen.Gruppierung Sammlung von Element durch Interface-Implementierung
Jetzt muss ich diese Elemente durch Schnittstellen gruppieren, die sie implementieren, aber jede Klasse implementiert mehrere Schnittstellen.
alles, was ich meine Schnittstellen erhalten verwenden die Reflexion Assembly wie folgt:
Assembly.GetExecutingAssembly().GetTypes().Where(o => o.IsInterface).ToList();
Das ist sehr nett, aber das Problem ist, dass ich eine Liste von Type
Objekt zu erhalten, so dass ich Linq iterieren und verwenden nicht leicht können abfragen die Elemente für jeden Typ und rufen Sie die Sammlung gruppiert ab. Ich weiß, dass ich die Sammlung manuell bauen muss, ich hoffte, eine OfType<>
zu verwenden, aber ich kann nicht mit einer Type
.
hier, was ich hatte gehofft, dass es aussehen im Finale:
// my list of all the items i have (Item being the base class)
var items = new List<Item>();
// get all interface of my assembly
var interfaces = Assembly.GetExecutingAssembly().GetTypes().Where(o => o.IsInterface).ToList();
// create an anonymous group with type and list of items of that type
var groups = interfaces.Select(interfaceType=>
new
{
Type = interfaceType,
Items = items.OfType<interfaceType>().ToList() // here's my issue
});
Ich frage mich, ob es etwas, das ich übersehen haben und nicht sehen, oder muss ich wirklich Artikel nach Artikel vergleichen Prüfen Sie, ob sie den Typ implementieren. Oder meine zweite Lösung ist eine items.Where(item => items as [My Type]).Where(item=> item != null)
, die nicht viel sauberer ist.
Edit: hier ist ein Beispiel von Daten, die
inputs (3 classes) :
item 1 : ISquare, IRectangle, IData
item 2 : IRectangle, IData, IReporting
item 3 : IData
Desired output (collection of 4 because 4 interface exists) :
{ ISquare, { item 1 }},
{ IRectangle, { item 1, item 2 }},
{ IData, { item 1, item 2, item 3 }},
{ IReporting, { item 2, item 3 }}
Warum Reflexion nicht verwenden, um die Schnittstellen zu erhalten, die das aktuelle Objekt mit 'GetType() implementiert Find()'.. Obwohl es nicht wirklich offensichtlich ist, wie man sie gruppieren möchte, sobald man das hat. – juharr