C# - Typumwandlung

nahkillo94

PC-Selbstbauer(in)
Hat jemand eine Idee, wie man das schöner schreiben kann:

Code:
                if      (x == "Wert1")
                {
                    name = ((Objekt1)ObjektListe[i]).ObjektName;
                }
                else if (x == "Wert2")
                {
                    name = ((Objekt2)ObjektListe[i]).ObjektName;
                }
                else if (x == "Wert3")
                {
                    name = ((Objekt3)ObjektListe[i]).ObjektName;
                }

Annahme:
-Objekt1, 2 und 3 sind abgeleitet von einen HauptObjekt
-ObjektListe ist eine Liste mit HauptObjekt
- HauptObjekt hat ein Attribut "ObjektName", das logischerweise auch Objekt1, 2 und 3 haben

Die Lösung ist bestimmt ganz einfach, aber ich komme einfach nicht drauf :huh:
 
Wenn das Property ObjektName in der Basisklasse vorhanden ist, ist es automatisch auch in den abgeleiteten Klassen enthalten.
Das hast Du bereits richtig erkannt.

Damit ist aber auch die Typkonvertierung überflüssig, solange Du nur auf die Properties der Basisklasse zugreifst.
Erst wenn Du erweiterte Properties aus den einzelnen abgeleiteten Klassen nutzt, kommst Du um den Cast nicht drum herum.

Also einfach name = ObjektList.ObjektName;
 
?

Also objekte an sich kann man nicht ableiten .....
Wenn du meinst, dass die Objekte 1 bis 3 (bzw. allg bis n) Instanzen einer Klasse1 sind, die von einer Hauptklasse abgeleitet ist, dann müsste es z.B. so gut gehen (frei Hand geschrieben, also Fehler könnten drin sein :P):
Code:
class Klasse1 : Hauptklasse { ... }
class Hauptklasse { ... }

//Irgendwo im Code
List<Klasse1> liste = new List<Klasse1>();

liste.Add([die objekte eben]);

foreach (Hauptklasse convertedObject in liste)
{
       switch (convertedObject .ObjektName)
      {
             case "Wert1": ..... break;
             ....
             case "Wertn": ..... break;
      }
}

//Oder auch
for (int i=0;i< liste.Count; i++)
{
      Hauptklasse tmpObj = (Hauptklasse) liste[i];
      switch (tmpObj .ObjektName)
      {
             case "Wert1": ..... break;
             ....
             case "Wertn": ..... break;
      }

}
EDIT:
Oder wie der VOrredner schon sagte, wenn es einfach nur um den Namen geht ist es natürlich einfacher den in die Hauptklasse zu ziehen ;)
 
Hmm, stimmt. Die 3. Bedingung ist falsch. Die Basisklasse hat keine Eigenschaft ObjektName. Nur die einzelnen Klassen haben eventuell diese Eigenschaft. Ob sie das haben, wird über den Wert ermittelt.

Da fällt mir grad auf, dass ich ein sehr blödes Beispiel gewählt habe.

Code:
                if      (x == "Objekt1")
                {
                    name = ((Objekt1)ObjektListe[i]).Hallo;
                }
                else if (x == "Objekt2")
                {
                    name = ((Objekt2)ObjektListe[i]).Hallo;
                }
                else if (x == "Objekt3")
                {
                    name = ((Objekt3)ObjektListe[i]).Hallo;
                }

Also die Basisklasse hat keine Eigenschaft "Hallo".

Die Liste enthält nur Ableitungen der Basisklasse.

Diese Ableitungen haben allerdings die Eigenschaft "Hallo".

Um auf die Eigenschaft "Hallo" zuzugreifen, wenn ich mir ein Element aus der Liste nehme, muss ich es vorher umwandeln.
(durch Casting)

So, hoffentlich ist das verständlich :)

EDIT: ja, fadade, war auch blöd formuliert^^

Es gibt also eine Hauptklasse und n "Unter"-Klassen die von Hauptklasse abgeleitet sind. Hauptklasse hat nicht die gewünschte Eigenschaft, aber ein paar der Unterklassen haben die Eigenschaft.
 
Zuletzt bearbeitet:
Es gibt also eine Hauptklasse und n "Unter"-Klassen die von Hauptklasse abgeleitet sind. Hauptklasse hat nicht die gewünschte Eigenschaft, aber ein paar der Unterklassen haben die Eigenschaft.

Hmm... das ist schon a bissel doof. Dann tu die Eigenschaft lieber doch in die Hauptklasse und setz sie auf null wenn sie nicht gebraucht wird, dass kann man ja bei der Abfrage ja recht leicht dann prüfen und mögliche Fehler verhindern ;)
Ansonsten müsstest du tatsächlich für jeden Typ Unterklasse das einzeln implementieren (und der Flexibilität halber) das dann ggf. in eine statische cast Methode paggn. Die könnte ja Delegaten übergeben bekommen und den ausführen, je nach Eingabetyp, wenn du schon so weit bist :)
 
was meinst du mit: "wenn du schon so weit bist"? :what: Ich bin kein Einsteiger, auch wenn die Frage so klingt. :D


Also deine erste Idee hatte ich auch schon. Allerdings dachte ich, dass es eine elegantere Lösung gibt und mit Delegaten arbeite ich persönlich nicht so gerne.
 
Zurück