2009-05-27 5 views
2

Ich verwende System.Reflection, um einen Typ zu laden, den ich sonst während der Entwurfszeit nicht laden kann. Ich muss alle Kontrollen innerhalb einer Ansammlung dieses Typs ziehen, jedoch scheint der OfType Befehl die Reflexionssyntax nicht zu mögen. hier ist "nah dran" was ich bekommen habe..Net Reflection zum Definieren von OfType verwenden

Damit dieser Code falsch ist, funktioniert es nicht, aber Sie bekommen die Idee von dem, was ich versuche zu tun. Gibt es eine Möglichkeit, Reflektion zu verwenden und alle Steuerelemente dieses Typs zu erhalten?

Antwort

3

OfType ist eine generische Methode, daher können Sie ihr einen statischen Typ geben (z. B. OfType(Of String)), nicht einen System.Type, der zur Laufzeit ermittelt wird.

Man könnte so etwas wie zu tun:

Dim CustomControlType as Type = LoadCustomType() 

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

Cast(Of Control) Mit dem ControlCollection (IEnumerable) zu einem IEnumerable<Control>, zu konvertieren, die dann alle Lambda-Erweiterungen bekommt.

+0

das sieht gut aus, aber: „Wo“ scheint nicht –

+0

in System.Web.UI.ControlCollection erscheinen @Russ Wo ist eine Erweiterung Methode auf IEnumerable, gleich wie OfType. Solange Sie den System.Linq-Namespace enthalten haben, haben Sie Zugriff auf beide Methoden. –

+0

ControlCollection implementiert IEnumerable nicht –

0

wie diese versuchen:

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

warum nicht ersetzen OfType mit einem Wo, in dem Sie die Art testen?

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

EDIT: Darin war schneller ... und tatsächlich seine Lösung ist besser, weil es Klassen abgeleitet Griffe

0

Haben Sie so etwas wie dies versucht?

Dim query = From i In MyBaseControl.Controls Where i.GetType is ControlType