Avatar billede ladefoged Nybegynder
31. januar 2012 - 00:50 Der er 12 kommentarer og
1 løsning

Object til list eller array

Jeg har efterhånden siddet fast længe med et problem i C# og det ser ikke ud til at jeg kommer en løsning ret meget nærmere uanset hvad jeg prøver.

Problemet er at jeg har et object med noget information i som jeg gerne vil kunne tilgå.

Objectet hedder "message", I kan se lidt info om objectet på http://simpelservice.dk/eksperten/eksperten_spm_31-01-2012.png

Jeg har f.eks. prøvet med
List<string> messageList = List<string>message;

Men det giver heller ingen resultat, håber virkelig der er nogen af jer som kan give se hvad problemet er for synes efterhånden jeg har stigeret mig blind på problemet.

P.s. Sig endelig til hvis I har brug for mere af koden for at kunne se problemet.

Mvh Nikolai
Avatar billede Syska Mester
31. januar 2012 - 00:59 #1
List<string> messageList = (List<string>)message;
Avatar billede Tylon_Foxx Nybegynder
31. januar 2012 - 08:55 #2
Kinne være dejligt med mere forklaring af koden, for kan slet ikke se hvad objectet i det hele taget skal være

er objectet en tekstreng fra et andet sted i programmet?
i så fald, hvorfor er det ikke en string i forvejen?
hvor initialiserer (new'er) du din liste?
hvilke fejl får du?

det er selvfølgelig en mulighed at caste objectet til en list som buzzzz skriver...

men som sagt, mere kode kan være en hjælp :)
Avatar billede ladefoged Nybegynder
31. januar 2012 - 21:23 #3
buzzzz det virker desværre heller ikke og jeg får ikke nogen fejl meddelser så det er lidt svært at gætte hvad problemet er.

Jeg smider lige lidt mere kode med så det forhåbentligt giver lidt mere mening for jer

Programmet jeg er ved at lave skal samarbejde med PubNub.com mere specefikt deres C# api https://github.com/pubnub/pubnub-api/tree/master/csharp

Den originale funktion fra deres eksempel er
pubnub.Subscribe(
        "hello_world", // Channel Name
        delegate (object message) {
            Console.WriteLine(message); // Print Received Message
            return true;                // Keep Listening?
        }
    );

Min tilpassede funktion
pubnub.Subscribe(
    "ifc0nfig",
    delegate(object message)
    {
        changeLED(message);

        return true;
    }
);


Her under Pubnub klassen skåret ret meget ind til benet

public class Pubnub {
    public delegate bool Procedure(object message);
   
    /**
    * Subscribe
    *
    * This function is BLOCKING.
    * Listen for a message on a channel.
    *
    * @param string channel name.
    * @param Procedure function callback.
    */
    public void Subscribe( string channel, Procedure callback ) {
        this._subscribe( channel, callback, 0 );
    }
}

Her under koden der har med changeLED at gøre
public void changeLED(object message)
{
    //Det er denne linje som ikke virker
    pubNubMessage pubNubMsg = JsonConvert.DeserializeObject<pubNubMessage>(message);

    if (pubNubMsg.test == "asdasd564sdf64sd")
    {
        if (pubNubMsg.state)
        {
            MessageBox.Show("ON");
        }
        else
        {
            MessageBox.Show("OFF");
        }
    }
}
       
public class pubNubMessage
{
    public string test;
    public bool state;
}
Avatar billede Syska Mester
31. januar 2012 - 21:31 #4
Så er "message" ikke en liste.

Men kan du ikke lige finde ud af hvad Type object er?

break point, mouse over og så burde du kunne se typen.

Hvis det er json kan du ikke lave en ToString på det og se værdien.

Kan du fortælle mig hvad "Ikke virker" betyder? Det er et utroligt godt eksemple på at vi helt sikkert mangler MASSERE af information for at kunne hjælpe dig.

Tænk på den her. "Min bil virker ikke" ... hvad ville du så tænke? Der kunne jo være 10000000000000 ting galt ... og en så simple ting som at den mangler diesel/benzin :-)
Avatar billede Syska Mester
31. januar 2012 - 21:33 #5
Hvis du kigger på den ... så er det en Dictionary og derfor burde du kunne caste den til:

var dict = (Dictionary<string, string>)message;

Men hvis du ingen runtime eller compile fejl får ... så er der mere du ikke fortæller os :-)
Avatar billede ladefoged Nybegynder
31. januar 2012 - 22:49 #6
Hej igen buzzzz og tak for din humoristiske og meget overbærende måde at håndtere en tosse som mig på ;)

Med hensyn til typen må det være en System.Collections.Generic.Mscorlib_Dictionry som vist her http://simpelservice.dk/eksperten/eksperten_spm_31-01-2012.png hvis jeg ikke er helt skæv på den.

Men når jeg prøver at bruge
var dict = (Dictionary<string, string>)message; som du skriver så ender dict = null (http://simpelservice.dk/eksperten/eksperten_spm_31-01-2012_2.png)

Jeg får fejl når jeg køre eksemplet ovenfor, pga. at message er et obejct og JsonConvert forventer en string, skrev koden på den måde for at illustrere hvad jeg gerne ville, men det fejlede hvis ;)

Her er en lille video som skulle forklare lidt om hvilke object det er http://screencast-o-matic.com/watch/clVwrJyNG håber den giver dig/jer lidt flere idéer, for må nok indrømme det er russisk for mig.
Avatar billede Syska Mester
31. januar 2012 - 23:02 #7
Hvem siger du skal laves som du gør? Hvor har du den kode fra?
Men udover det, så er der flere ting der tænder alarm klokker ved mig.

public class pubNubMessage
{
    public string test;
    public bool state;
}

Du har ingen af overstående i din Dictionary. Du har en "text" som inderholder "key" ... så mon ikke du skulle rette den i overstående.

Udover det, så bruger du fields og ikke properties. Ved ikke om
den JsonConverter kan finde ud af det.

Jeg ville nok lave den her lidt om og overholde et par code conventions mht til navngivning.
public class PubNubMessage // Alle klasser bør navngives med http://en.wikipedia.org/wiki/CamelCase i .NET
{
    public string Text {get; set;}// samme gælder properties.
    public bool state{get; set;}
}

Har du virkelig ikke mere information du kan give os?
Avatar billede ladefoged Nybegynder
31. januar 2012 - 23:38 #8
Jeg tager den lige forfra.

Målet er at få en besked fra PubNub.com ind i et C# program.
Beskeden som sendes fra PubNub for at teste er {"besked":"Hej eksperten"}

Nedenstående kode giver ingen fejl men der kommer heller ingen MessageBox frem, så min første indskydelse var at beskeden fra PubNub slet ikke kom ned til mit program, men det gør den godt nok som I kan se her http://screencast-o-matic.com/watch/clVw3yy8h

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

using System.Web.Extensions;
using Newtonsoft.Json;
using System.Collections;

namespace PubNub_Test_2
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        Pubnub pubnub = new Pubnub(
            "pub-************",
            "sub-************",
            null,
            false
        );

        private void button1_Click(object sender, EventArgs e)
        {
            if (!backgroundWorker1.IsBusy)
            {
                backgroundWorker1.RunWorkerAsync();
            }

        }

        public void modtagBesked(object message)
        {
            pubNubMessage pubNubMsg = new pubNubMessage();

            pubNubMsg = (pubNubMessage)message;

            MessageBox.Show(pubNubMsg.besked);
        }

        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            pubnub.Subscribe(
                "ifc0nfig",
                delegate(object message)
                {
                    modtagBesked(message);

                    return true;
                }
            );
        }
    }

    public class pubNubMessage
    {
        public string besked {get; set;}
    }
}

I korte træk er mit problem at jeg ikke kan få informationen fra message objektet over i mit pubNubMessage objekt så jeg kan tilgå informationen.

Kildekoden i PubNub klassen kan ses her https://github.com/pubnub/pubnub-api/blob/master/csharp/Pubnub.cs
Avatar billede Syska Mester
31. januar 2012 - 23:51 #9
Jeg forstår ikke den ikke giver en Runtime fejl når du caster dit object til pubNubMessage ... giver ingen mening.

Men er du sikker på du ikke skal lave en convert af det json med Newtonsoft?

Ville være nemmere at debug hvis du lige pakkede koden og smed det op et sted. Der må ske et eller andet mærkeligt.
Avatar billede Syska Mester
31. januar 2012 - 23:52 #10
Noget ala som de gør her: http://james.newtonking.com/pages/json-net.aspx

mvh
Avatar billede ladefoged Nybegynder
02. februar 2012 - 20:20 #11
Så lykkedes det at finde en løsning. Buzzzz vil du smide et svar for  selv om du ikke kom med den endelige løsning, fik du skubbet mine tanker i den rigtige retning.

Den endelige løsning blev

public void modtagBesked(object message)
{
  var json = new JavaScriptSerializer().Serialize(message);
  pubNubMessage pubNubMsg = new pubNubMessage();
  pubNubMsg = new JavaScriptSerializer().Deserialize<pubNubMessage>(json);

  MessageBox.Show(pubNubMsg.besked);
}

Om det så er overkill ved jeg ikke, men for nu er det en godkendt løsning :)
Avatar billede Syska Mester
02. februar 2012 - 23:30 #12
svar.

Overstående giver ingen mening. Sikker på du ikke kan lave en kopi af dit projekt med de information/dll's jeg skal bruge.

Overstående skriger om at der er noget galt.

Jeg kan dog ikke lige helt regne det ud.
Avatar billede Syska Mester
02. februar 2012 - 23:30 #13
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester