2016-12-12 7 views
1

私はすべて共通の基本タイプを持つオブジェクトのコレクションを持っています。これらのオブジェクトは、多くの異なるレベルで導出され、すべてのプロパティはインターフェイスの実装に由来します。グループ化インターフェイスの実装によるアイテムのコレクション

// my list of all the items i have (Item being the base class) 
var items = new List<Item>(); 

これらの項目を実装するインターフェイスでグループ化する必要がありますが、各クラスは複数のインターフェイスを実装しています。

私はそうのようなアセンブリのリフレクションを使用するすべての私のインターフェイスを取得するには:

Assembly.GetExecutingAssembly().GetTypes().Where(o => o.IsInterface).ToList(); 

これは非常にかわいいですが、問題は、私は簡単に照会するのLINQを反復して使用することはできませんので、私はTypeオブジェクトのリストを取得するということです各タイプのアイテムを検索し、グループ化されたコレクションを取得します。私はOfType<>を使用することを望んでいた私はコレクションを手動で構築する必要があることを知っているが、私はTypeですることはできません。

ここで私はそれが最終的に見えるように期待していた:私は疑問に思って

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

を私が見落としているものがあるかどうかを確認したり、私が本当にした項目によって項目を比較する必要はありませんでしたそれらが型を実装しているかどうかを確認してくださいまたは、私の2番目の解決策は、それほど清潔ではないitems.Where(item => items as [My Type]).Where(item=> item != null)を使用しています。

編集:ここinterfaceTypeので

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

がなぜ現在のオブジェクトが 'メソッドGetType()FindInterfacesを使用して実装のインターフェイスを取得するためにリフレクションを使用していません()'。一度それをグループ化する方法を正確には明らかではありませんが、 – juharr

答えて

1

を助けるかもしれないデータのサンプルがタイプSystem.Typeの目的であるだ 、変数はOfType<T>()メソッドの型パラメータとして使用することはできません。

あなたはこのように、WhereIsAssignableFromを使用することができます。

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

他のオプションの1つとして 'is'をチェックするよりもはるかに読みやすくなります。これは完璧です。 – Franck

関連する問題