2009-03-27 13 views
1

abgeleitet ist Ich habe eine Liste von Steuerelementen (_controlList) und aus der Liste der Steuerelemente möchte ich diejenigen, die von einer bestimmten Klasse ableiten. Also habe ich Code, der so aussieht.Wie finden Sie heraus, ob ein Steuerelement von einer Klasse

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(); 
} 

Irgendwelche Gedanken. Ich muss nicht in der Art passieren, es ist der String Namen der Klasse sein könnte

Antwort

5

Zuerst habe ich wahrscheinlich Generika verwenden würde:

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(); 
} 

Oder in .NET 3.5:

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

Wenn Sie Type verwenden, dann IsAssignableFrom ist dein Freund, insbesondere:

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

Danke Marc, das ist eine sehr schöne Art, das zu lösen – Jiminy

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

Ich habe das versucht und es kompiliert es ging sehr eng mit dem, was ich hatte. Das entspricht dir? – Jiminy

+0

-1. Es würde auch nie wieder wahr werden. – pipTheGeek

+0

Warum würde es nie wieder wahr werden? Wenn 'gesuchter Typ' der Typ ist, nach dem Sie suchen, wird dies auf jeden Fall wahr zurückgeben. Und es wird auch kompilieren. GesuchtTyp sollte kein String oder was auch immer sein, es sollte wirklich der Name des Typs sein. –

1

der C# ist Betreiber hat bereits eine Typprüfung (wie der Vb TypeOf Operator), so erwartet es so etwas wie
if (Kontrolle MyNamespace.MyControl)
diese Ordnung ist, wenn Sie die Art der Sie suchen wissen zur Kompilierzeit, aber nicht gut für Ihre Situation. Auch, wenn Ihr Test geändert wurde, um eine Referenz gleich Test zu tun (Sorry, ich bin ein VB-Programmierer wirklich, der VB-Operator wäre IS, aber ich weiß nicht die C# eine) dann würde Ihr Test nur wahr, wenn die Kontrolle war der Typ, für den getestet wurde, nicht, dass es vom gesuchten Typ geerbt wurde.
Versuchen
control.GetType(). IsSubClassOf (soughtType)

Beachten Sie, dass IsSubClassOf nicht wahr zurück, wenn Steuerung eines soughtType ist, aber Ihre Frage fragte nur Kontrollen zu finden, die von soughtType geerbt.

+0

Whoops, das sollte eine Bearbeitung meiner vorherigen Antwort sein. – pipTheGeek

+0

Danke für Ihre Kommentare pTG Ich wusste nicht über .IsSubClassOf. – Jiminy

Verwandte Themen