2016-06-15 27 views
0

Gerade jetzt, das ist, was ich tue, die Klasse der Elemente in meinem WPF-Leinwand zu erhalten:Abrufen eines Klasse des Objekts

// for instance 
    private void R_MouseMove(object sender, System.Windows.Input.MouseEventArgs e) 
    { 
     if (sender.ToString() == "System.Windows.Shapes.Rectangle") 
     { 
      // ok i am a rect 
      System.Windows.Shapes.Rectangle r = (System.Windows.Shapes.Rectangle)sender; 
      //etc... 
     } 
    } 

Irgendwie habe ich das Gefühl, es ist ein eleganter Weg, dies zu tun. Etwas in den Zeilen:

if (class(sender) == System.Windows.Shapes.Rectangle) ... 

Mit anderen Worten, gibt es Reflexion in C# und wenn nicht, wie man es emuliert?

+1

'if (Absender ist System.Windows.Shapes.Rectangle) ...' –

+1

Beachten Sie auch 'sender.GetType()' und 'sender as Rectangle'. –

+0

Da sich die Frage nach WPF richtet, sollten Sie wissen, dass Absender und Ereignisquelle für Routingereignisse voneinander abweichen können. – Dennis

Antwort

7

Sie suchen wahrscheinlich für den is Betreiber:

if (sender is System.Windows.Shapes.Rectangle) 
    // it's a rectangle 

Oder vielleicht besser nutzen die as Betreiber:

System.Windows.Shapes.Rectangle rect = sender as System.Windows.Shapes.Rectangle; 
if (rect != null) 
{ 
    // do something with rect 
} 

aber dies wird nur für die Klassen arbeiten, nicht für Strukturen oder andere Werttypen . Wenn sender nicht von diesem Typ ist, wird rectnull (eine direkte Umwandlung wie (Rectangle)sender würde stattdessen eine InvalidCastException werfen).


Beachten Sie, dass beide Operatoren auch für Basistypen arbeiten. Wenn also sender wirklich ein Rectangle ist, gibt sender is Shape auch true zurück.

+0

Einfach und elegant. Vielen Dank! – roymcclure

Verwandte Themen