2016-12-12 1 views
1

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 }} 
+0

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

Antwort

1

helfen kann Da interfaceType ist ein Objekt vom Typ System.Type, kann die Variable nicht als Typ-Parameter von OfType<T>() Methode verwendet werden.

können Sie verwenden IsAssignableFrom mit Where, wie folgt aus:

var groups = interfaces.Select(interfaceType => new { 
    Type = interfaceType 
, Items = items.Where(item => interfaceType.IsAssignableFrom(item.GetType()).ToList() 
}); 
+0

Viel besser lesbar als die Suche nach "ist" als eine meiner anderen Optionen. Dies ist perfekt. – Franck

Verwandte Themen