Laden...

Auf Objekt in TreeNode.Tag zugreifen, wenn der Typ des Objekts nicht feststeht

Erstellt von FeelFlow vor 13 Jahren Letzter Beitrag vor 13 Jahren 4.678 Views
F
FeelFlow Themenstarter:in
67 Beiträge seit 2010
vor 13 Jahren
Auf Objekt in TreeNode.Tag zugreifen, wenn der Typ des Objekts nicht feststeht

Hi!

Wie kann ich mir das was ich bei TreeNode.Tag eingetragen habe wieder auslesen?

Vor allem wenn da unterschiedliche Klassen hinterlegt sind? Also nicht alle Nodetags sind gleich.

Dankö

Gelöschter Account
vor 13 Jahren

mayclass c = mynode.Tag as mayclass;
if(c != null) { mayclass.DoSomethingAwesome();}

edit: siehe auhc: [Tipp] Casten aber richtig: Begriffe wie Cast / is / as

1.002 Beiträge seit 2007
vor 13 Jahren

Hallo FeelFlow,

TreeNode.Tag hat den Datentyp object, von daher müssen die hinterlegten Objekte erst in die entsprechenden Klassen gecastet werden.

MyClass myClass = TreeNode.Tag as MyClass;
if (myClass != null)
{
    // Cast war erfolgreich, TreeNode.Tag war vom Datentyp MyClass (oder ein Derivat davon)

    /* Code ... */
}

Siehe auch [Tipp] Casten aber richtig: Begriffe wie Cast / is / as.

m0rius

Mein Blog: blog.mariusschulz.com
Hochwertige Malerarbeiten in Magdeburg und Umgebung: M'Decor, Ihr Maler für Magdeburg

F
FeelFlow Themenstarter:in
67 Beiträge seit 2010
vor 13 Jahren

Ich weiß aber nicht, was im Tag is... es kann sein, dass in myClass casten muss aber es kann auch vorkommen, dass es in yourClass kommt.

1.002 Beiträge seit 2007
vor 13 Jahren

Hallo FeelFlow,

das ist natürlich der Nachteil an object. Wenn es eine feste, kleine Anzahl an möglichen Klasse ist, kannst du natürlich den obigen Codeblock mehrfach verwenden und auf mehrere Typen prüfen.

m0rius

Mein Blog: blog.mariusschulz.com
Hochwertige Malerarbeiten in Magdeburg und Umgebung: M'Decor, Ihr Maler für Magdeburg

F
FeelFlow Themenstarter:in
67 Beiträge seit 2010
vor 13 Jahren

Also ich hab mal was probiert...


myClass a = treeView.SelectedNode.Tag as myClass;
yourClass b = treeView.SelectedNode.Tag as yourClass;
if (a != null)
{
     //mach was
}
if (b != null)
{
     //mach was anderes
}

Wenn das Object nicht in myClass passt, dann bleibt a = null

Find ich aber nicht sonderlich elegant, weil ich das ganze auch 7 mal machen muss.

Gelöschter Account
vor 13 Jahren

das untypisierte .Tag property als sammelbecken für alles mögliche zu verwenden ist auch nicht sonderlich elegant.

endweder du überdenkst das design oder musst damit leben das du permanent casten musst.

1.002 Beiträge seit 2007
vor 13 Jahren

Hallo FeelFlow,

wie JAck30lena schon gesagt hat, ist das ganze eine Design-Frage und derzeit nicht elegant gelöst. Hast du keine Möglichkeit, eine gemeinsame Basisklasse oder ein implementiertes Interface zu verwenden und nach diesem zu casten?

m0rius

Mein Blog: blog.mariusschulz.com
Hochwertige Malerarbeiten in Magdeburg und Umgebung: M'Decor, Ihr Maler für Magdeburg

3.511 Beiträge seit 2005
vor 13 Jahren

Eine Basisklasse über alle Klassen zu ziehen - hat ja m0rius bereits erwähnt - ist wohl die eleganteste Lösung.

Sollten es dennoch komplett unterschiedliche Klassen sein, obwohl das Design dann irgendwie verquer ist, könnte man über TreeNode eine generische Extension Method legen, die einen den passenden Typ aus dem Tag ermittelt. Das würde dann die Tipparbeit drastisch vermindern. Der eigentliche Problem ist dann natürlich das gleiche.

"Jedes Ding hat drei Seiten, eine positive, eine negative und eine komische." (Karl Valentin)

F
FeelFlow Themenstarter:in
67 Beiträge seit 2010
vor 13 Jahren

hmm... ich werde aber wohl nicht drumrum kommen, jeden klick einzeln auszuwerten, was da eigentlich geklickt wurde.

F
FeelFlow Themenstarter:in
67 Beiträge seit 2010
vor 13 Jahren

Könnt ihr mir das mit der basisklasse genauer erklären?

1.002 Beiträge seit 2007
vor 13 Jahren

Hallo FeelFlow,

momentan weißt du lediglich, dass in TreeNode.Tag beliebige Objekte abgelegt sind, die aber allesamt - wie jedes Objekt in .NET - von object ableiten. Wenn du die gemeinsame Basisklasse konkretisieren kannst, also beispielsweise weißt, dass TreeNode.Tag ein IEnumerable<string> enthält, kann es dir ja egal sein, ob dort nun ein String-Array string[] enthalten ist oder eine List<string>. Deshalb kannst du nach IEnumerable<string> casten und mit dieser Abstraktion weiterarbeiten.

m0rius

Mein Blog: blog.mariusschulz.com
Hochwertige Malerarbeiten in Magdeburg und Umgebung: M'Decor, Ihr Maler für Magdeburg

49.485 Beiträge seit 2005
vor 13 Jahren

Hallo FeelFlow,

Könnt ihr mir das mit der basisklasse genauer erklären?

bitte beachte [Hinweis] Wie poste ich richtig? Punkt 1.1.1.

Polymorphie (und darum geht es ja) setzen wir als bekannt voraus.

herbivore