私はすべて共通の基本タイプを持つオブジェクトのコレクションを持っています。これらのオブジェクトは、多くの異なるレベルで導出され、すべてのプロパティはインターフェイスの実装に由来します。グループ化インターフェイスの実装によるアイテムのコレクション
// 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 }}
がなぜ現在のオブジェクトが 'メソッドGetType()FindInterfacesを使用して実装のインターフェイスを取得するためにリフレクションを使用していません()'。一度それをグループ化する方法を正確には明らかではありませんが、 – juharr