Laden...

Foreach-Schleife mit quasi unbekanntem Typ

Erstellt von Telefisch vor 13 Jahren Letzter Beitrag vor 13 Jahren 3.279 Views
Thema geschlossen
T
Telefisch Themenstarter:in
372 Beiträge seit 2008
vor 13 Jahren
Foreach-Schleife mit quasi unbekanntem Typ

Hallo Forum,
Ich stehe hier vor einem Problem mit einer foreach-Schleife.

Grund meiner "merkwürdigen" Schleife ist folgender:
Ich habe eine Datenbank, die mittels ORM bearbeitet wird.
Jetzt möchte ich einen Tree mit einigen Feldern aus einigen Tabellen aufbauen.
Diesen muss ich "manuell" erstellen, wobei jede Tabelle ihren eigenen Zweig bekommt.
Damit ich aber nicht für jede Tabelle die gleiche Methode schreiben muss, hatte ich mit vorgestellt einfach eine Methode zu verwenden und den Typ der Tabelle (quasi das Tabellenobject) in der Schleife auszutauschen.

Da ich jeden Zweig einzel aktualisieren möchte rufe ich die Methode für jede Tabelle einzeln auf und übergebe ihr im Grunde nur eine Kennung anhand derer ich das Tabellenobjekt ermittle (natürlich könnte ich Ihr gleich den typ übergeben, hätte aber M.E. auch keine Auswirkung auf das Problem/die Lösung):

 
private void PopulateStructuredNodes(TypeOfDevice type)
        {
            TreeListNode ParentNode = GetNodeWithTagString(treeView.FocusedNode, "database");
            // Typ des zu aktualisierenden Knotens ermitteln
            string NodeName;
            string Filter ="";
            Type obj = typeof(xpo.Device);   //der Versuch schonmal einen Default-Typ zu definieren
            XPCollection col = db.colDevices;
            switch (type)
            {
                case TypeOfDevice.DEVICE:
                    NodeName = "fieldDevices";
                    Filter = "TypeOfDevice = 0";
                    obj = typeof(xpo.Device);
                    col = db.colDevices;
                    break;
                case TypeOfDevice.CABLE:
                    NodeName = "cables";
                    Filter = "TypeOfDevice = 1";
                    obj = typeof(xpo.Cable);
                    col = db.colCables;
                    break;

.... usw.
         

in meiner Schleife greife ich nur auf Felder zu, die in jeder Tabelle vorhanden sind.
In meinem Leichtsinn habe ich folgendes verucht:


foreach (obj item in col)
            {
                strHigherLevelFunction = item.HigherLevelFunction;
                strFunction = item.Function;
                strInstallationSite = item.InstallationSite;
                strMountingLocation = item.MountingLocation;
                strFunctionNumber = item.FunctionNumber;
                strUserDefined = item.UserDefined;
                strBMK = item.BMK;

...usw

Das haut natürlich vorne und hinten nicht hin.
Zunächst bekomme ich die Meldung, dass Typ oder Namespace für obj nicht gefunden werden konnte und dann sind natürlich die ganzen Eigenschaften von item unbekannt.

Wie geht man an solch ein Werk heran?
Liege ich grundsätzlich falsch?

Danke im Voraus,
Tele

F
12 Beiträge seit 2005
vor 13 Jahren

wie wäre es, wenn du ein interface definierst für die klassen. die verschiedenen typen haben augenscheinlich ja immer die gleichen properties.

T
Telefisch Themenstarter:in
372 Beiträge seit 2008
vor 13 Jahren

Guter Hinweis, Danke
Schau ich mir an.

Weitere Tips willkommen 😉

Z
403 Beiträge seit 2007
vor 13 Jahren

Hallo Telefisch,

foreach (obj item in col) ergibt auch keinen sinn ausser du hast einen Typen namens obj definiert

Vielleicht meintest du Object.

Die Möglichkeit mit Interfaces ist sicher die beste.

Darüber hinaus sind das Grundlagen der OOP, du solltest dich vielleicht besser einlesen.

Gruß André

K
34 Beiträge seit 2009
vor 13 Jahren

wenn die propertys etc bei allen gleich vorkommen und sich nur der Typ ändert fällt mir spontan "dynamic" als Datentyp ein. Da ich damit noch nix gemacht kann ich aber nich 100% sagen ob das das passende an der Stelle ist...

Aber einmal nachschlagen kann nie schaden 😉

T
Telefisch Themenstarter:in
372 Beiträge seit 2008
vor 13 Jahren

Also, André...
ja, obj ist defniert.
Wenn Du mal schauen magst, ganz oben im Code (als Typ).
Und ja, da ist wieder die Frage wo fängt Grundlage an und wo hört sie auf.

Kao, danke für den Tipp.

5.658 Beiträge seit 2006
vor 13 Jahren

Wenn Du mal schauen magst, ganz oben im Code (als Typ).

Meinst du etwas das?

Type obj = typeof(xpo.Device);  

Weeks of programming can save you hours of planning

771 Beiträge seit 2009
vor 13 Jahren

'obj' ist aber eine Variable, kein Typ!
Wenn schon, dann


foreach (xpo.Base item in col)

wobei dann 'xpo.Base' die Basisklasse aller Typen in der XPCollection sein muß.

Welchen Typ hat denn 'XPCollection'? List<xpo.Base> oder List<object>?

916 Beiträge seit 2008
vor 13 Jahren

Ich versteh gar nix mehr. Du meinst also tatsächlich das

Type obj = typeof(xpo.Device); deinen Typ definiert??????
Wenn du sowas machen willst
foreach (obj item in col) dann brauchst du auch eine Klasse namens "obj". Dann sind doch absolute Grundlagen!

Again what learned...

T
Telefisch Themenstarter:in
372 Beiträge seit 2008
vor 13 Jahren

Nach kurzer Unterbrechung konnte ich mich endlich wieder dem Thema widmen.
Die Schnittstelle war die einfachste Lösung.

Hätte ich selbst drauf kommen können aber um den hier nach Grundlagen schreienden mal etwas die Ursache für mein Unwissen mitzuteilen:

Ich habe das Thema Klassen und Schnittstellen bereits mehrfach durchgeackert aber konnte beim "lernen" nie einen Sinn in Schnittstellen sehen, da ich bisher nie vor der Problematik stand Diese verwenden zu müssen (bis jetzt).
Mir war es einfach nie einleuchtend warum ich eine Schnittstelle anbieten sollte, wenn ich doch die Klasse selbst verwenden kann.
Daher habe ich den Zusammenhang schlicht nicht gesehen und das Thema deswegen verpennt.
Und ja, dass ich für eine Foreach-Schleife eine Klasse brauche ist mir durchaus bekannt.
Es gibt dann halt "verzeifelte" Versuche selbst ans Ziel zu kommen, weil ich mich nicht auf dem Wissen anderer Ausruhen will.

Und ja, mag sein, dass ich hier wieder einmal den Deppen gemacht habe und die Grundlagen schon wieder nicht verstanden habe 😦
Ich entschuldige mich tausend mal dafür aber ich bin leider kein Vollzeitprogrammierer.
Da hier offensichtlich immer wieder die Diskussion aufkommt was Grundlagen sind und dass man diese Fragen hier nicht stellen darf haben ich mal ne ganz banale Grundlagenfrage:

Kennt jemand ein Grundlagen-Fähiges Forum?
Die hier anwesenden Vollprofis und Berufsprogrammierer haben doch auch mal klein angefangen...

Vielen Dank an alle helfenden Mitglieder.

5.658 Beiträge seit 2006
vor 13 Jahren

Hallo Telefisch, du brauchst dich nicht entschuldigen, du hast dich auch nicht zum Deppen gemacht und wir haben nichts gegen Anfänger. Hier kannst du dich in Ruhe zu den Grundlagen belesen: 🛈, für alle weiteren Fragen stehen wir dir gerne zur Verfügung!

Weeks of programming can save you hours of planning

T
Telefisch Themenstarter:in
372 Beiträge seit 2008
vor 13 Jahren

Dank Dir MrSparkle,
das ist eh schon meine Standard-Lektüre.
Oft reicht ja der Hinweis in die richtige Richtung.

Also danke nochmal
Gruß Tele

49.485 Beiträge seit 2005
vor 13 Jahren

Hallo Telefisch,

Kennt jemand ein Grundlagen-Fähiges Forum? www.myCSharp.de (sic!). Siehe dazu [FAQ] Wie finde ich den Einstieg in C#?. Das wir keine Fragen nach Grundlagen erlauben hat ja nicht den Zweck, dass wir Anfänger ärgern oder gar vergraulen wollen, sondern dass wir sie fördern und fordern wollen. Grundlagen lernt man nun mal systematischer, verlässlicher, gründlicher und insgesamt besser aus einem Buch als aus einem Forum (egal welches Forum).

wir haben nichts gegen Anfänger.

So ist es. Ich kann das nur voll unterschreiben.

Vielen Dank an alle helfenden Mitglieder.

Auch wenn man es als Anfänger manchmal noch nicht gleich erkennt: Bei Grundlagenfragen ist es in den meisten Fällen die bessere Hilfe, auf ein Buch oder die Doku zu verweisen, statt die Frage konkret zu beantworten. Gib jemanden einen Fisch und er ist einen Tag satt, ermuntere ihn selber zum Fischen und er ist sein Leben lang satt. Wir verweisen ja auch nie auf ein Buch oder die Doku ohne nicht ein Stichwort zu geben oder einen Hinweis auf die richtige Richtung. Wenn du uns die Treue hältst, wirst es sicher nicht bereuen.

herbivore

Thema geschlossen