2009-05-27 3 views
2

System.Reflectionを使用して、設計時にロードできない型をロードしています。このタイプのコレクション内のすべてのコントロールを取得する必要がありますが、私はOfTypeコマンドは反射構文が気に入らないようです。ここに私が得たものに "近い"ものがあります。.Net ReflectionをOfTypeを定義するには

Dim ControlType As Type = System.Reflection.Assembly.GetAssembly(_ 
          GetType(MyAssembly.MyControl)) _ 
         .GetType("MyAssembly.MyUnexposedControl") 

Dim Matches as List(Of Control) = MyBaseControl.Controls.OfType(Of ControlType) 

コードが偽であるため、機能しませんが、私がしようとしていることが分かります。リフレクションを使用してそのタイプのコントロールをすべて取得する方法はありますか?

答えて

3

OfTypeは一般的な方法であるため、実行時に決定されるSystem.Typeではなく、静的型(例:OfType(Of String))を与えることができます。

Dim CustomControlType as Type = LoadCustomType() 

MyBaseControl.Controls.Cast(Of Control)().Where(Function(ctrl) ctrl.GetType().IsAssignableFrom(CustomControlType)) 

は、すべてのラムダの拡張子を取得した、IEnumerable<Control>ControlCollectionIEnumerable)に変換するCast(Of Control)を使用した:

あなたのような何かを行うことができます。

+0

、しかし、「どこで」OfTypeと同じIEnumerableを上の拡張メソッド、あるSystem.Web.UI.ControlCollection –

+0

@Russに表示されていないようです。 System.Linq名前空間が含まれている限り、両方のメソッドにアクセスできます。 –

+0

ControlCollectionはIEnumerable –

0

は次のように試してみてください:

Dim ControlType As Type = System.Reflection.Assembly.GetAssembly(_ 
         GetType(MyAssembly.MyControl)) _ 
        .GetType("MyAssembly.MyUnexposedControl") 

Dim Matches as List(Of Control) = MyBaseControl.Controls.Where(Function(control) ControlType.GetType().IsAssignableFrom(control.GetType()) 
0

あなたはタイプをテストしたところでOfType交換しないで、なぜ?

Dim Matches as List(Of Control) = MyBaseControl.Controls.Where(Function(ctl) ctl.GetType() = ControlType) 

EDIT:ダーリンは速かった...そして実際にそれが派生クラス

0

を処理するので、彼のソリューションが優れている、あなたがこのような何かをしようとしたことがありますか?これはよさそうだ

Dim query = From i In MyBaseControl.Controls Where i.GetType is ControlType 
関連する問題