2009-03-27 6 views
1

J'ai une liste de contrôles (_controlList) et de cette liste de contrôles je veux obtenir ceux qui dérivent d'une classe donnée. J'ai donc du code qui ressemble à ceci.Comment savoir si un contrôle dérive d'une classe

List<Control> _controlList = new List<Control>(); 

public Control[] ControlsThatIsA(Type soughtType) 
{ 
    List<Control> result = new List<Control>(); 
    foreach (Control control in _controlList) 
    { 
// This would have been nice but doesn't compile 
////////////// 
// if (control.GetType() is soughtType) 
    { 
     result.Add(control); 
    } 
    } 
return result.ToArray(); 
} 

Aucune idée. Je ne dois pas passer le type, il pourrait être le nom de chaîne de la classe

Répondre

5

D'abord, je serais probablement utiliser les médicaments génériques:

public T[] ControlsOfType<T>() where T : Control 
{ 
    List<T> result = new List<T>(); 
    foreach (Control control in _controlList) 
    { 
    if (control is T) 
    { 
     result.Add((T)control); 
    } 
    } 
    return result.ToArray(); 
} 

Ou dans .NET 3.5:

return _controlList.OfType<T>().ToArray(); 

Si vous devez utiliser Type, puis IsAssignableFrom est votre ami, en particulier:

if(soughtType.IsAssignableFrom(control.GetType())) { 
    //... 
} 
+0

Merci Marc, c'est une très belle façon de résoudre ça – Jiminy

-1
if(control is soughtType) 
{ 
} 
+0

J'ai essayé ceci et il ne compile pas il est allé très étroitement avec ce que j'avais. Cela est conforme pour vous? – Jiminy

+0

-1. Cela ne reviendrait jamais vrai. – pipTheGeek

+0

Pourquoi ne reviendrait-il jamais vrai? Si 'seekType' est le type que vous recherchez, cela retournera définitivement true. Et il compilera aussi. requestedType ne devrait pas être une chaîne ou quoi que ce soit, ce devrait vraiment être le nom du type. –

1

C# est l'opérateur fait déjà un test de type (comme l'opérateur Vb TypeOf), il attend quelque chose comme
si (contrôle est MyNamespace.MyControl)
cela est très bien si vous connaissez le type que vous recherchez au moment de la compilation, mais pas bon pour votre situation. Aussi, si votre test a été changé pour faire un test de référence égal (désolé, je suis vraiment un programmeur VB, l'opérateur VB serait IS mais je ne connais pas le C#) alors votre test ne retournerait vrai que si le le contrôle a été testé pour le type, pas pour le fait qu'il ait été hérité du type recherché.
Essayez
control.GetType(). IsSubClassOf (soughtType)

Notez que IsSubClassOf ne reviendra pas vrai si le contrôle est l'un des soughtType, mais votre question ne demande de ne trouver que des contrôles qui ont hérité de soughtType.

+0

Oups, c'était censé être un edit de ma réponse précédente. – pipTheGeek

+0

Merci pour vos commentaires pTG Je ne connaissais pas .IsSubClassOf. – Jiminy

Questions connexes