Sender casten ?

w_digger

Grünschnabel
Hallo alle zusammen,

ich hätte da mal eine Frage zum casten des Senders.

Normalerweise kann ich ja schreiben : ((Button)sender).Name

aber was ist, wenn ich nicht weiß, daß es ein button ist. bzw. überhaupt nicht weiß was es für ein Typ ist?

Schöne Grüße
w_digger
 
Nach meinem Denken (was nicht selten total daneben ist ;) ) müsste logischerweise das hier klappen:

Code:
Dim senderTyp As System.Type = sender.GetType()
TryCast(sender, senderTyp)

aber es klappt nicht :D
 
Wenn du keinen Zieltyp weißt, zu was willst du dan casten? Dann weißt du ja nicht mal, welche Eigenschaften du zur Verfügung hast.

Anders ist es, wenn du weißt, dass der sender auf jeden Fall eine bestimmte Schnittstelle implementiert. Dann kannst du zum Typ dieser Schnittstelle casten und hast dann Zugriff auf die Eigenschaften/Methoden/wasauchimmer welche die Schnittstelle bereitstellt.

mfg
 
Wenn du vll weißt, dass es eine gewisse Anzahl an Typen sein kann die du kennst. Kannst du es doch mit nem Select machen:

Code:
Select Case sender.GetType.ToString
            Case "Button"

            Case "ListBox"

            Case "Label"

            Case Else

End Select
 
Viel dank schon mal

@ Kyoko
Ich möchte z. B. immer wenn eine Komponente verlassen wird den Inhalt des Textes oder des SelectedIndex oder was auch immer in einen String schreiben.
Oder ich möchte immer eine bestimmte Methode der Komponente anstossen.

@Koppelschoof
Natürlich ist switch case eine Option, aber c# ist doch intelligent genug mit den Typen zu übergeben, daß sollte doch auch heißen, daß ich diese Information auch dann anders verarbeiten können müsste.

Gruß
w_digger
 
Ich würde da mal grundlegende Dinge klären:
Von welchem Event sprichst du überhaupt? D.h. was wird angestoßen und was soll dann passieren. Welche Elemente sind im Spiel und warum weißt du nicht, welcher Typ im Sender steckt?
 
@Norbert Eder
Frage 1: Das Event ist doch egal. Es kann bei Leave, Enter oder auch Click sein. Ich bekomme doch grundsätzlich den Sender mit.

Frage 2: Ich habe z.B. ein paar Komponenten auf meine Bedürfnisse erweitert. Nennen wir sie mal myTextBox, myComboBox und myListbox und alle haben die zusätzlichen Methoden onClick und onLeave. Diese sollen immer zu den entsprechen Momenten gestartet werden.

Frage 3: Natürlich weiss ich über sender.getType() was im sender steht, aber mit der Info kann ich nicht casten, bzw. ich weiss nicht wie.

Ich hatte gehofft, daß ich ein Funktion schreibe kann, die etwa so aus sieht:

Code:
this.myTextBox1.Leave += new System.EventHandler(this.funktionsname);
this.myTextBox2.Leave += new System.EventHandler(this.funktionsname);
this.myComboBox1.Leave += new System.EventHandler(this.funktionsname);
this.myComboBox2.Leave += new System.EventHandler(this.funktionsname);
this.myListBox1.Leave += new System.EventHandler(this.funktionsname);
this.myListBox2.Leave += new System.EventHandler(this.funktionsname);

private void funktionsname(object sender, EventArgs e)
{
   ((sender.getType())sender).onLeave();
}

aber ((sender.getType())sender).onEnter(); läuft nicht.

Das ist in etwa der Grundgedanke, aber mir geht es auch um die grundsätzliche Frage.

Danke
w_digger
 
Wie bereits von mir vorgeschlagen, nimm Interfaces. Wenn du eh nur mit abgeleiteten Klasse narbeitest, die so und so schon 2 Methoden auf jeden Fall können, dann schreib ein Interface für die Methoden und implementier es in die Klassen.

Kleines Beispiel dazu:

Code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            A objA = new A();
            B objB = new B();

            Test(objA);
            Test(objB);

            Console.ReadLine();
        }

        public static void Test(object sender)
        {
            ((ITest)sender).Print();
        }
    }

    class A : ITest
    {
        public void Print()
        {
            Console.WriteLine("A");
        }
    }

    class B : ITest
    {
        public void Print()
        {
            Console.WriteLine("B");
        }
    }

    public interface ITest
    {
        void Print();
    }
}

Keine Events, aber das ist egal.
 
Erstmal viel Dank an alle.

Das mit den Interfaces muß ich mir mal genau angucken, bin halt noch am Anfang meiner C#-programmierung.
Gruß
w_digger
 
Zurück