Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Gleiche Methode für verschiedene Eigenschaften verwenden
EyeTrackJack
myCSharp.de - Member



Dabei seit:
Beiträge: 33

Themenstarter:

Gleiche Methode für verschiedene Eigenschaften verwenden

beantworten | zitieren | melden

Hallo, ich habe das Problem, dass ich mehrere Eigenschaften einer Klasse mit der gleichen Methode bearbeiten muss. Und ich habe bis jetzt keine Lösung gefunden, außer die Methode zu kopieren und die Eigenschaft abzuändern. Das Ganze sieht so aus

 foreach (ListBoxItem selItem in InterListBox.SelectedItems)
{
      int selIndex = InterListBox.Items.IndexOf(selItem);
      if (double.TryParse((sender as TextBox).Text, out double d))
      InterWindowList[selIndex].Top = d;                
}

Hier wird aus einer Textbox der Wert ausgelesen und auf ein Fenster angewendet, das in einer Liste gespeichert ist. Und aus Top wird auch mal Left oder was genz anderes.

Wie kann ich jetzt verschiedene Eigenschaften bearbeiten, ohne die Methode jeweils zu kopieren?

Das Problem ist, dass ich nicht weiß, wonach ich suchen soll. Ich würde mich freuen, wenn ihr mir helfen könntet. Diese Problematik habe ich immer wieder.

Grüße
Tobias
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 15534
Herkunft: BW

beantworten | zitieren | melden

Das Code Snippet alleine lässt sich nur bedingt generisch umsetzen.
Es ist hier nicht ersichtlich, was InterWindowList[selIndex]

Es kann gut sein, dass diese Problematik ein Folgeeffekt eines nicht korrekten Aufbaus ist.
Eine Erweiterungsmethode bringt Dir hier kaum was.
private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 3954

beantworten | zitieren | melden

Zum einen solltest du den Parameter (sender as TextBox).Text (bzw. die ganze Zeile) aus der Schleife herausziehen und zum anderen hast du quasi (unnötigerweise) eine doppelte Schleife erzeugt (durch das IndexOf) - durchlaufe das ganze Array und frage auf IsSelected ab.

Dein Problem bzgl. unterschiedlicher Eigenschaften könntest du entweder mittels Reflection lösen oder aber mittels eines Delegates.

Hier mittels eines Delegates (Action<...>):


// WindowListType mußt du entsprechend setzen (es muß eine Klasse sein!)
void SetValue(string sText, Action<WindowListType, int index, double d> onSet) // todo: besseren Methodennamen finden
{
    if (double.TryParse(sText, out double d))
    {
        foreach (ListBoxItem item in InterListBox.Items)
        {
            if (item.IsSelected)
            {
                onSet?.Invoke(InterWindowList, selIndex, d);
                break;
            }
        }
    }
}

// mit Aufruf
SetValue((sender as TextBox).Text, (list, idx, d) => list[idx].Top = d); // hier kannst du auch andere Eigenschaften benutzen
(bzw. noch besser wäre es zwei Methoden zu haben, so daß auch die erste Zeile herausgezogen wird und nur der Parameter d übergeben wird bzw. sogar generisch zu machen!)

Ich persönlich würde die Methode sogar soweit generisch machen, daß sie static ist und alle Variablen als Methodenparameter übergeben werden (also auch InterListBox.Items sowie InterWindowList),
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von Th69 am .
private Nachricht | Beiträge des Benutzers
EyeTrackJack
myCSharp.de - Member



Dabei seit:
Beiträge: 33

Themenstarter:

beantworten | zitieren | melden

Super Antwort, TH69. Jetzt weiß ich, in welche Richtung ich weitersuchen muss. Vielen Dank.
private Nachricht | Beiträge des Benutzers
EyeTrackJack
myCSharp.de - Member



Dabei seit:
Beiträge: 33

Themenstarter:

beantworten | zitieren | melden

Ich habe es jetzt mal getestet und es funktioniert, wobei ich auf Invoke verzichtet habe. Glaube nicht, dass es nötig wird, es von anderen Threads aus aufzurufen. Oder gibt es einen Grund, es mit Invoke zu machen?

Aus Foreach habe ich ein For gemacht, da ich sonst nicht an den Index komme.

Wie dem auch sei, ich habe mal wieder was dazugelernt!
private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 3954

beantworten | zitieren | melden

Hier geht es nicht um die Control.Invoke-Methode, sondern um die Invoke-Methode für die Delegate-Klasse:
Zitat
Hinweis

The common language runtime provides an Invoke method for each delegate type, with the same signature as the delegate. You do not have to call this method explicitly from C#, Visual Basic, or Visual C++, because the compilers call it automatically. The Invoke method is useful in reflection when you want to find the signature of the delegate type.
(extra auf englisch, da die deutsche [maschinelle] Übersetzung mal wieder gruselig ist)

Ich habe extra den ?.-Operator verwendet, um bei Übergabe von null keine Exception auszulösen - und dafür benötigt man einen Methodennamen (onSet?.(InterWindowList, selIndex, d) funktioniert syntaktisch nicht).
private Nachricht | Beiträge des Benutzers