2009-05-27 11 views
2

J'utilise System.Reflection pour charger un type que je ne peux pas charger lors de la conception. J'ai besoin de tirer tous les contrôles dans une collection de ce type, cependant, la commande OfType ne semble pas aimer la syntaxe de réflexion. voici "proche de" ce que j'ai. Donc, ce code est faux, cela ne fonctionne pas, mais vous avez l'idée de ce que j'essaie de faire. Alors, y a-t-il un moyen d'utiliser la réflexion et d'obtenir tous les contrôles de ce type?.Net Utiliser la réflexion pour définir OfType

Répondre

3

OfType est une méthode générique, vous pouvez lui donner un type statique (par exemple OfType(Of String)), pas un System.Type déterminé lors de l'exécution.

Vous pouvez faire quelque chose comme:

Dim CustomControlType as Type = LoadCustomType() 

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

En utilisant Cast(Of Control) pour convertir le ControlCollection (IEnumerable) à un IEnumerable<Control>, qui obtient alors toutes les extensions lambda.

+0

ce qui semble bon, cependant, « Où » ne semble pas apparaître dans System.Web.UI.ControlCollection –

+0

@Russ Où est une méthode d'extension sur IEnumerable, même que OfType. Tant que vous avez l'espace de noms System.Linq inclus, vous aurez accès aux deux méthodes. –

+0

ControlCollection n'implémente pas IEnumerable –

0

Essayez comme ceci:

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

Pourquoi ne pas remplacer OfType avec un cas où vous testez le type?

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

EDIT: Darin était plus rapide ... et en fait sa solution est mieux car il gère les classes dérivées

0

Avez-vous essayé quelque chose comme ça?

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