33 Stimmen

Absender-Objekt im Event-Handler mit GetType().Name abbilden

Ich habe sowohl für eine Textbox als auch für eine RichTextBox einen Event-Handler. Der Code ist identisch, aber

In Handler #1 tue ich das:

RichTextBox tb = (RichTextBox)sender

Im Handler #2 entsprechend:

TextBox tb = (TextBox)sender

Auf diese Weise kann ich die Sendekontrolle vollständig manipulieren. Was ich wissen möchte ist, wie kann ich das sendende Objekt in Textbox oder RichTextbox umwandeln, je nach Typ mit

sender.GetType().Name

und dann das Steuerelement zur Laufzeit erstellen und mit ihm arbeiten. Auf diese Weise brauche ich nur eine Event-Handler-Funktion: weniger Code, weniger Fehler, einfacher zu pflegen und DRY :-)

38voto

leppie Punkte 111830

Sie müssen nie werfen. Als ich anfing, habe ich genauso gedacht, dieses "Muster" ist falsch und nicht wirklich logisch.

Am besten ist es, wenn Sie etwas wie:

if (sender is TextBox)
{
  TextBox tb = (TextBox)sender;
}
else if (sender is RichTextBox)
{
  RichTextBox rtb = (RichTextBox)sender;
}
else
{
  // etc
}

9voto

Mark Kram Punkte 5458

Ich weiß, dass dies ein sehr alter Beitrag ist, aber in Framework 4 können Sie den Absender als Kontrolle verwenden:

Control cntrl = (Control)sender;
cntrl.Text = "This is a " + sender.GetType().ToString();

Beachten Sie, dass Sie nur auf Steuerelemente verweisen können, die alle verschiedenen Steuerelemente gemeinsam haben (z. B. Text).

8voto

stuartd Punkte 65785

Anstelle des Typnamens können Sie auch ' es '.

Wenn Sie nur den Typ wissen wollen und keine Objektreferenz benötigen:

if (sender is RichTextBox)
{
    // ...
}
else if (sender is TextBox)
{
    // ...
}

Aber im Allgemeinen wollen Sie das Objekt haben: C#7 hat eine schöne Syntax, die es Ihnen erlaubt, den Wert inline zu testen und zu erhalten:

if (sender is RichTextBox richTextBox)
{
    richTextBox.Text = "I am rich";
}
else if (sender is TextBox textBox)
{
    textBox.Text = "I am not rich";
}

4voto

Chris S Punkte 63542
RichTextBox textbox = sender as RichTextBox;
if (textbox != null)
{
   // do stuff as a rtb
   textbox.Text = "I'm a rtb";
   return;
}

TextBox textbox = sender as TextBox;
if (textbox != null)
{
   // do stuff as a textbox
   textbox.Text = "I'm a textbox";
}

3voto

Peter Lillevold Punkte 32995

Ein Casting kann nur zur Kompilierzeit durchgeführt werden, daher müssen Sie die Typen, in die Sie casten wollen, zur Kompilierzeit kennen. Ein Laufzeittyp (wie von GetType() zurückgegeben) kann daher beim Casting nicht verwendet werden.

Wenn Sie nach Polymorphismus suchen, können Sie über Reflection auf die Eigenschaft Name zugreifen. Ich würde diesen Weg aber nicht gehen, nur um Ereignis-Handler wiederverwenden zu können.

Wenn Sie eine starke Typisierung wünschen, ist eine gemeinsame Basisklasse oder Schnittstelle für die beiden Absender die einzige Möglichkeit.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X