Object[] wieder auslesen



  • Hallo, habe mal folgende Frage zu diesem Code:

    using System;
    using System.Collections;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace testqueue
    {
        class Program
        {
            public class StructX
            {
                public bool bData
                {
                    get;
                    set;
                }
    
                public string strData
                {
                    get;
                    set;
                }
            }
    
            static void Main(string[] args)
            {
                StructX aaa = new StructX();
                StructX bbb = new StructX();
                StructX ccc = new StructX();
                aaa.bData = true;
                aaa.strData = "a";
                bbb.bData = false;
                bbb.strData = "b";
                ccc.bData = true;
                ccc.strData = "c";
    
                Queue Q = new Queue();
                Q.Enqueue(aaa);
                Q.Enqueue(bbb);
                Q.Enqueue(ccc);
    
                Object[] Obj = Q.ToArray();
            }
        }
    }
    

    Wie kann ich denn jetzt wieder die einzelnen Elemente/Werte auslesen aus dem Obj (letzte Zeile)?



  • Garnicht. Weil du ein Object Array hast, gehen die Informationen "verloren". Nur durch ein Downcast könntest du darauf zugreifen. Benutz doch stattdessen ein Queue<StructX>.



  • FreakY<3Cpp schrieb:

    Garnicht. Weil du ein Object Array hast, gehen die Informationen "verloren". Nur durch ein Downcast könntest du darauf zugreifen. Benutz doch stattdessen ein Queue<StructX>.

    Ich habe keine Ahnung wie das mit Queue<StructX> funktioniert... Hat das was mit Templates zu tun? Wo schreibe ich das hin?



  • Im Debugmodus steht das so im Obj:

    - Obj {object[3]} object[]

    - [0] {testqueue.Program.StructX} object {testqueue.Program.StructX}
    -> bData true bool
    -> strData "a" string

    - [1] {testqueue.Program.StructX} object {testqueue.Program.StructX}
    -> bData false bool
    -> strData "b" string

    - [2] {testqueue.Program.StructX} object {testqueue.Program.StructX}
    -> bData true bool
    -> strData "c" string



  • Du kannst die Object-Referenzen auch wieder zurückcasten:

    StructX s = (StructX) Obj[0];
    

    So hat man das vor Generics gemacht. Mit Generics etwa so:

    Queue<StructX> q = new Queue<StructX>();
    StructX a = ...
    q.Enqueue(a);
    
    StructX[] array = q.ToArray();
    

    Die nicht-generische Queue ist System.Collections.Queue, die generische ist System.Collections.Generic.Queue.

    BTW deine Schreibweise -- alles mit Großbuchstaben -- ist etwas ungewöhnlich. Außerdem finde ich es etwas verwirrend, dass deine Klasse StructX heißt, obwohl sie keine struct ist.



  • Ok, danke! 🙂


Anmelden zum Antworten