Avatar billede kennedk Nybegynder
08. januar 2008 - 17:04 Der er 7 kommentarer og
1 løsning

Enum change listener

Hej jeg sidder og roder med en Console app, og jeg vil gerne udføre en kode hver gang jeg sætter mit enum til noget andet.

Min kode

    class Program
    {
        private static Status _status = Status.Slut;

        static void Main(string[] args)
        {
            Commands();
        }

        private static void Commands()
        {
            String cmd = Console.ReadLine().ToLower();
            if(cmd.Equals("start"))
                _status = Status.Start;
            if(cmd.Equals("slut"))
                _status = Status.Slut;

            Commands();
        }
    }
    enum Status
    {
        Start,
        Slut
    }

i min Commands() kan i se jeg laver mit enum om i _status, og når det sker skal der gerne køres en kode automatisk.

Hvordan kan det lade sig gøre?
Avatar billede nielle Nybegynder
08. januar 2008 - 18:26 #1
Indkabsling i en property kunne være tricket:

    class Program
    {
        static void Main(string[] args)
        {
            Commands();
        }

        private static Status m_status = Status.Slut;
        private static Status _status
        {
            get { return m_status; }
            set
            {
                // Hvis du skal btuge før-værdien ...
                Status _statusGl = m_status;
                Status _statusNy = value;

                // Udfør din ekstra kode her...
                // f.eks.:
                if (_statusNy != _statusGl)
                    Console.WriteLine("_status ændret");

                m_status = _statusNy;
            }
        }

        private static void Commands()
        {
            String cmd = Console.ReadLine().ToLower();

            if (cmd.Equals("start"))
                _status = Status.Start;

            if (cmd.Equals("slut"))
                _status = Status.Slut;

            Commands();
        }
    }

    enum Status
    {
        Start,
        Slut
    }
Avatar billede kennedk Nybegynder
08. januar 2008 - 18:33 #2
Det er sgu super det der :)

Koden ser sådan her ud nu :

class Program
    {
        private static Status m_status = Status.Slut;
        private static Status _status
        {
            get { return m_status; }
            set
            {
                m_status = value;
                OnStatusChange(m_status);
            }
        }

        private static void OnStatusChange(Status status)
        {
            switch (status)
            {
                case Status.Start:
                    Console.WriteLine("Du startede!");
                    break;
                case Status.Slut:
                    Console.WriteLine("Du sluttede");
                    break;
                default:
                    break;
            }
        }
        static void Main(string[] args)
        {
            Commands();
        }
        private static void Commands()
        {
            String cmd = Console.ReadLine().ToLower();
            if (cmd.Equals("start"))
                _status = Status.Start;
            if (cmd.Equals("slut"))
                _status = Status.Slut;
            if (cmd.Equals("exit") || cmd.Equals("quit"))
                return;
            Commands();
        }

       
    }
    enum Status { Start, Slut }
Avatar billede nielle Nybegynder
08. januar 2008 - 18:36 #3
Værdien bliver ikke nødvendigvis ændret selv om ser() kaldes:

_status = Status.Start;
_status = Status.Start;
_status = Status.Start;

Vil du have at OnStatusChange() kaldes hver gang?
Avatar billede kennedk Nybegynder
08. januar 2008 - 18:39 #4
Det forstod jeg ikke lige ?

men for at den ikke skal køres hver gang kan man jo
private static Status _status
        {
            get { return m_status; }
            set
            {
                Status _statusOldValue = _status;
                m_status = value;
                if (_statusOldValue != value)
                    OnStatusChange(m_status);
            }
        }

Som du viste :)
Avatar billede kennedk Nybegynder
08. januar 2008 - 18:43 #5
men jeg så en kammerat i dag, han gjorde et eller andet fikst med en eventhandler, som gik ind og gjorde et eller andet som så også kørte koden når status'en blev lavet om

Hvordan kan det måske laves?
Avatar billede nielle Nybegynder
08. januar 2008 - 19:04 #6
Der er ikke rigtigt noget der ringer.

Du må da meget geren poste det her, hvis du finder ud af det. :^)
Avatar billede kennedk Nybegynder
08. januar 2008 - 19:43 #7
Det skal jeg gøre :)
Avatar billede nielle Nybegynder
09. januar 2008 - 08:53 #8
Ok, jeg tror at jeg ved hvad det gik ud på det der med EventHandler - jeg må tilstå at jeg nok blev lidt forvirret af at du brugte "OnStatusChanged" som normalt netop indikere at der er tale om en eventhandler - bortset fra at det ikke var en eventhandler i dit tilfælde.

Eventhandlere lægger normalt op til at man ønsker at kunen kommunikere f.eks. et status skift imellem to forskellige objekter. Enten af samme klasse, eller af forskellige klasser.

De ligger derimod ikke så meget op til at man bruger dem internt i samme instans, eller selve klasse (som når du bruger static på det hele). I det tilfælde er den kun med til at gøre syntaksen ugennemskuelig:

    // Prototypen for en eventhandler på Status.
    public delegate void StatusChanged(Status status);

    public enum Status { Start, Slut }

    class Program
    {
        // Eventhandlere giver normalt kun
        // mening, hvis de er synlige udefra.
        public static event StatusChanged OnStatusChanged;

        private static Status m_status = Status.Slut;
        internal static Status _status
        {
            get { return m_status; }
            set
            {
                m_status = value;

                // Hvis der er nogen som lytter, skal eventhandleren kaldes.
                if (OnStatusChanged != null)
                    OnStatusChanged(m_status);
            }
        }

        // Den metode som vi ønsker at kalde ved Status ændring.
        // Ved at indføre en eventhandler har vi besluttet os
        // for ikke at kalde den direkte fra set() metoden.
        private static void ChangeHasChanged(Status status)
        {
            switch (status)
            {
                case Status.Start:
                    Console.WriteLine("Du startede!");
                    break;
                case Status.Slut:
                    Console.WriteLine("Du sluttede");
                    break;
                default:
                    break;
            }
        }

        static void Main(string[] args)
        {
            // Set ChangeHasChanged til at lytte
            // på callbacks fra eventhandleren.
            OnStatusChanged = ChangeHasChanged;

            Commands();
        }

        private static void Commands()
        {
            String cmd = Console.ReadLine().ToLower();
            if (cmd.Equals("start"))
                _status = Status.Start;
            if (cmd.Equals("slut"))
                _status = Status.Slut;

            Commands();
        }
    }
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