Laden...

Herausfinden, ob eine Klasse bzw. Object eine bestimme Methode oder Ereignis hat

Erstellt von kkirchhoff vor 13 Jahren Letzter Beitrag vor 13 Jahren 1.816 Views
K
kkirchhoff Themenstarter:in
118 Beiträge seit 2008
vor 13 Jahren
Herausfinden, ob eine Klasse bzw. Object eine bestimme Methode oder Ereignis hat

Hallo,

wie kann man an Hand des Methoden-Names feststellen, ob eine Klasse bzw. ein Object (Control) einen Verweis auf diese Methode hat.

Ich möchte alle Controls eines Forms auslesen und prüfen ob das jeweilige Control die gesuchte Methode aufweist und diese dann aufrufen.

Ist das überhaupt möglich?

Gruss und Danke

1.002 Beiträge seit 2007
vor 13 Jahren

Hallo kkirchhoff,

ja, das ist per Reflection möglich, aber kein gutes Design.

Besser wäre es, zu versuchen, deine Controls in einen bestimmten Typ zu casten und auf diesen stark typisierten Controls die Zielmethode aufzurufen:

foreach (Control control in myControlCollection)
{
    // Cast vornehmen
    Button button = control as Button;

    // Ist control vom Typ Button (oder vom Typ einer abgeleiteten Klasse von Button)?
    if (button != null)
    {
        // Ja, also Methode aufrufen
        button.PerformClick();
    }
}

m0rius

[edit]Kommentare hinzugefügt.[/edit]

Mein Blog: blog.mariusschulz.com
Hochwertige Malerarbeiten in Magdeburg und Umgebung: M'Decor, Ihr Maler für Magdeburg

K
kkirchhoff Themenstarter:in
118 Beiträge seit 2008
vor 13 Jahren

Danke für die Antwort, ich denke das werde ich wohl dann auf diesen Weg machen.

Nun möchte ich gern eine generische Funktion schreiben und aus einen ChildWindow, welches ich als Parameter übergeben alles Controls auslesen.



        private bool isFormValide(ChildWindow _inRootElement)
        {
            foreach (UIElement UiElement in (_inRootElement))
            {
                MessageBox.Show(UiElement.ToString());
            }


        }

Nur ich bekomme immer diesen Fehler.

**Eine foreach-Anweisung kann nicht für Variablen vom Typ "System.Windows.Controls.ChildWindow" verwendet werden, da "System.Windows.Controls.ChildWindow" keine öffentliche Definition für "GetEnumerator" enthält. **

Was mache ich falsch? Vielleicht hat ja jemand auch ein Beispiel.

Danke

1.002 Beiträge seit 2007
vor 13 Jahren

Hallo kkirchhoff,

bitte beachte [Hinweis] Syntaxfehler selbst lösen (Compilerfehlermeldungen) und [Hinweis] Wie poste ich richtig? Punkt 1.1.1 — das sind Grundlagen.
_inRootElement ist vom Typ ChildWindow. Die foreach-Schleife kann nur über Typen iterieren, die IEnumerable implementieren, und das tut ChildWindow nicht.

m0rius

Mein Blog: blog.mariusschulz.com
Hochwertige Malerarbeiten in Magdeburg und Umgebung: M'Decor, Ihr Maler für Magdeburg

K
kkirchhoff Themenstarter:in
118 Beiträge seit 2008
vor 13 Jahren

Hallo m0rius,

danke für die Antwort. Das es ein Compilerfehler ist weis ich. Mir ist der Fehler auch klar. Vielleicht habe ich meine Frage nicht richtig gestellt. Ich such eine Lösung oder eine Hilfe, wie ich bei einem ChildWindow die Controls auslesen kann.

Also wenn mir jemand helfen kann, fände ich das prima.

Danke

1.002 Beiträge seit 2007
vor 13 Jahren

Hallo kkirchhoff,

ChildWindow ist von ContentControl abgeleitet und besitzt deshalb eine Content-Eigenschaft vom Typ object — es enthält somit nur ein Kindelement! Dieses ist meist ein StackPanel oder irgendein anderes Panel, dessen Kindelemente du wiederum mit der Panel.Children-Eigenschaft vom Typ UIElementCollection auslesen kannst.

m0rius

[edit]Vererbungshierarchie eingefügt.[/edit]

Mein Blog: blog.mariusschulz.com
Hochwertige Malerarbeiten in Magdeburg und Umgebung: M'Decor, Ihr Maler für Magdeburg

K
kkirchhoff Themenstarter:in
118 Beiträge seit 2008
vor 13 Jahren

Hallo m0rius,

danke Dir .. ich denke das hilft mir sehr weiter 😃

1.044 Beiträge seit 2008
vor 13 Jahren

Hallo kkirchhoff,

dein Vorgehen ist nicht so gut. Ich würde stattdessen lieber die Möglichkeiten von WPF ausnutzen. Es mag sein, dass es Situationen gibt, an denen man das Problem nur so - wie du es jetzt macht - lösen kannst. Trotzdem würde ich dir raten, vorher zu überlegen, ob es nicht doch der falsche Weg ist.

Hallo m0rius,

eine Anmerkung von mir: Im ersten Codebeispiel von dir wird nicht geprüft, ob sich in myControlCollection nur Buttons befinden bzw. ob das jeweilige Item auch vom Typ Button ist. Es wäre besser, wenn du vor


Button button = control as Button;

prüfst, ob nicht control ein Button ist, sprich

if(control is Button) { /* */ }

zero_x

1.002 Beiträge seit 2007
vor 13 Jahren

Hallo zero_x,

Ich würde stattdessen lieber die Möglichkeiten von WPF ausnutzen.

die da konkret wären? Die Möglichkeit, Controls anhand ihres Namens zu finden? Ohne weitere Ausführungen ist der Hinweis – sorry – nicht so hilfreich.

Im ersten Codebeispiel von dir wird nicht geprüft, ob sich in myControlCollection nur Buttons befinden

Richtig, es können in myControlCollection auch andere Controls enthalten sein. So what 😃?

bzw. ob das jeweilige Item auch vom Typ Button ist. Es wäre besser, wenn du vor [...] prüfst, ob nicht control ein Button ist

Diese Überprüfung wäre völlig sinnlos, da ich bereits mit dem as-Operator caste. Ist control nicht vom Typ Button, enthält button den Wert null. Ausführlich wird der as-Cast im Artikel [Tipp] Casten aber richtig: Begriffe wie Cast / is / as besprochen.

m0rius

Mein Blog: blog.mariusschulz.com
Hochwertige Malerarbeiten in Magdeburg und Umgebung: M'Decor, Ihr Maler für Magdeburg

F
10.010 Beiträge seit 2004
vor 13 Jahren

@zero_x :

if(control is Button) { /* */ }

Im Gegenteil, wenn du FxCop einsetzt wird dir diese Vorgehensweise als falsch angekreidet.

Richtig ist was M0rius hier vorgeschlagen hat, erst per "as" umwandeln und dann auf null prüfen.
Dein Vorschlag würde im Fall das es ein Button ist 2 mal "casten" was nicht gut ist.