Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

Πέρσμα συνάρτησης ώς παραμέτρος σε συνάρτηση, χωρίς να με νοιάζει ο τύπος της.

Îåêßíçóå áðü ôï ìÝëïò pontifikas. Τελευταία δημοσίευση από το μέλος Markos στις 21-03-2009, 21:52. Υπάρχουν 9 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  18-03-2009, 16:43 49367

    Πέρσμα συνάρτησης ώς παραμέτρος σε συνάρτηση, χωρίς να με νοιάζει ο τύπος της.

    Προσπαθώ να φτιάξω μια συνάρτηση που να δέχεται ώς παράμετρο μια συνάρτηση και έναν ακέραιο ο οποίος συμβολίζει χρόνο.
    Η συνάρτηση θα ενεργοποιεί έναν timer Και μετά από τον ορισμένο χρόνο θα καλεί την συνάρτηση που της πέρασα σαν όρισμα.
    Αυτό με delegates μπορώ να το κάνω αλλά πρέπει να φτιάξω ένα delegate Και ένα overload της καλούσας για κάθε τύπο κληθείσης.
    πχ στον παρακ'ατω κώδικα έχω μια υλοποίηση για συνάρτηση που δέχεται ακέραιο και δεν επιστρέφει τίποτα.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    public delegate void FuctionCall(int par);
    
    public class TimedExecutioner: Timer
            {
                private FuctionCall FuncToCall;
                
                public TimedExecutioner(FuctionCall func)
                {
                    FuncToCall = func;
                }
    
                protected override void OnTick(EventArgs e)
                {
                    base.OnTick(e);
                    FuncToCall(10);
                    this.Stop();
                }
                public static void ExecFunctionInTime(FuctionCall func, int mSecs)
                {
                    TimedExecutioner executioner = new TimedExecutioner(func);
                    executioner.Interval = mSecs;
                    executioner.Start();
                }
            }

    Ευχαριστώ
  •  18-03-2009, 17:07 49369 σε απάντηση της 49367

    Απ: Πέρσμα συνάρτησης ώς παραμέτρος σε συνάρτηση, χωρίς να με νοιάζει ο τύπος της.

    Αν κατάλαβα καλά θέλεις να φτιάξεις ένα generic delegate. Αυτό ή κάτι άλλο;
    Ακόμα κι ένας άνθρωπος μπορεί ν' αλλάξει τον κόσμο. Μη θέλεις να κυβερνήσεις. Απλά δείξε το μονοπάτι κι ο κόσμος θ' ακολουθήσει!!
  •  18-03-2009, 20:32 49387 σε απάντηση της 49369

    Απ: Πέρσμα συνάρτησης ώς παραμέτρος σε συνάρτηση, χωρίς να με νοιάζει ο τύπος της.

    Δεν μου φαίνεται ότι είναι αυτό που θέλω. Καλύπτει τον τύπο των παραμέτρων αλλά όχι τον αριθμό.Πώς θα μπορώ να έχω διαφορετικές συναρτήσεις 0 ή περισσοτέρων παραμέτρων χωρίς να χρειάζεται να δηλώσω μια νέα Generic Delegate?

    Βασικά έκανα και το εξής και μου φαίνεται ότι πλησίασα


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    public delegate void FuctionCall(params object [] pars);
    
    public class TimedExecutioner: Timer
            {
                private FuctionCall FuncToCall;
                private object[] FuncPars = null;
    
                public TimedExecutioner(FuctionCall func,params object [] FuncPars)
                {
                    FuncToCall = func;
                    this.FuncPars = FuncPars;
                }
                protected override void OnTick(EventArgs e)
                {
                    base.OnTick(e);
                    FuncToCall(FuncPars);                
                    this.Stop();
                }
                public static void ExecFunctionInTime(int mSecs, FuctionCall func, params object [] FuncPars)
                {
                    TimedExecutioner executioner = new TimedExecutioner(func,FuncPars);
                    executioner.Interval = mSecs;
                    executioner.Start();
                }
            }
    Οπότε είναι δουλειά της κληθείσης συνάρτησης να διαχειριστεί τον αριθμό και τύπο των παραμέτρων που χρειάζεται.


  •  18-03-2009, 22:05 49392 σε απάντηση της 49387

    Απ: Πέρσμα συνάρτησης ώς παραμέτρος σε συνάρτηση, χωρίς να με νοιάζει ο τύπος της.

    Γιατί δεν προσπαθείς ν' απαλλαγείς από το object type, κάπως έτσι:

    public delegate void FuctionCall<T>(params T[] pars);
    
        public class TimedExecutioner<T> : Timer
        {
            private FuctionCall<T> FuncToCall;
            private T[] FuncPars = null;
    
            public TimedExecutioner(FuctionCall<T> func, params T[] FuncPars)
            {
                FuncToCall = func;
                this.FuncPars = FuncPars;
            }
            protected override void OnTick(EventArgs e)
            {
                base.OnTick(e);
                FuncToCall(FuncPars);
                this.Stop();
            }
            public static void ExecFunctionInTime(int mSecs, FuctionCall<T> func, params T[] FuncPars)
            {
                TimedExecutioner<T> executioner = new TimedExecutioner<T>(func, FuncPars);
                executioner.Interval = mSecs;
                executioner.Start();
            }
        }

    Δοκίμασέ το να δεις αν παίζει και διόρθωσε τα σφάλματα όπου υπάρχουν.


    Ακόμα κι ένας άνθρωπος μπορεί ν' αλλάξει τον κόσμο. Μη θέλεις να κυβερνήσεις. Απλά δείξε το μονοπάτι κι ο κόσμος θ' ακολουθήσει!!
  •  19-03-2009, 18:34 49438 σε απάντηση της 49392

    Απ: Πέρσμα συνάρτησης ώς παραμέτρος σε συνάρτηση, χωρίς να με νοιάζει ο τύπος της.

    Νομίζω, ότι με μια μικρή "χακιά" μπορείς να καλύψεις όλες τις περιπτώσεις σου. Απλώς θα πρέπει να κάνεις μια γραμμή processing πριν καλέσεις την ExecFunctionInTime(...)

    Πρώτα απο όλα, ξεφορτώσου το delegate σου ( FunctionCall<T> ), και χρησιμοποιήσε ένα Func<T> σαν παράμετρο. Τώρα, προτού καλέσεις την ExecInTime, όρισε ένα lambda το οποιό δημιουργείς επιτόπου, π.χ. ...

    Θέλω να καλέσω μια μέθοδο που λέγεται myOriginalFunction, η οποία επιστρέφει int, και έχει παραμέτρους int, string, bool, οκ; Έχω τις παραμέτρους μου σαν local variables, myInt, myString, myBool ... άρα μπορώ να κάνω το ...

    Func<int>  myParamFunc = (anInt, aString, aBool) => return myOriginalFunction(anInt, aString, aBool);

    .. και άρα "καπάκια" μπορώ να κάνω το  ExecFunctionInTime<int>(1000, myParamFunc);  


    Δεν ξέρω αν χρειάζεσαι το generic param στην ExecuteInTime, μόνο αν σε νοιάζει σε κάτι το αποτέλεσμα φαντάζομαι, αλλά με αυτή τη μικρή ^%$^ καλύπτεσαι μια χαρά, και σε όλες τις περιπτώσεις.

    Ελπίζω να βοήθησα, καλό βράδυ μας



    Angel
    O:]
  •  19-03-2009, 18:48 49439 σε απάντηση της 49438

    Απ: Πέρσμα συνάρτησης ώς παραμέτρος σε συνάρτηση, χωρίς να με νοιάζει ο τύπος της.

    Δεν έχεις άδικο. Και το Func<T> delegate είναι. Απλά ο φίλος μας δεν έχει ξεκαθαρίσει με ποια έκδοση του framework "παίζει" για να ξέρουμε αν μπορεί να χρησιμοποιήσει lamdas.
    Ακόμα κι ένας άνθρωπος μπορεί ν' αλλάξει τον κόσμο. Μη θέλεις να κυβερνήσεις. Απλά δείξε το μονοπάτι κι ο κόσμος θ' ακολουθήσει!!
  •  19-03-2009, 19:11 49442 σε απάντηση της 49439

    Απ: Πέρσμα συνάρτησης ώς παραμέτρος σε συνάρτηση, χωρίς να με νοιάζει ο τύπος της.

    Markos:
    Απλά ο φίλος μας δεν έχει ξεκαθαρίσει με ποια έκδοση του framework "παίζει" για να ξέρουμε αν μπορεί να χρησιμοποιήσει lamdas.


    .. για δες πως γυρνάνε οι καιροί ... πριν 1.5 χρόνο ήμουν στην ανάποδη θέση ... σε 1.1 να μου προτείνουν λύσεις απο 2.0 Smile

    Αναρωτιέμαι - δε θυμάμαι - αν οι dynamic delegates θα μπορούσαν να βοηθήσουν σε κάτι τέτοιο. Τέλος πάντων, το βραδάκι :]

    Angel
    O:]
  •  20-03-2009, 21:38 49469 σε απάντηση της 49442

    Απ: Πέρσμα συνάρτησης ώς παραμέτρος σε συνάρτηση, χωρίς να με νοιάζει ο τύπος της.

    Κατ' αρχήν ευχαριστώ για τις απαντήσεις.
    Μαρκο
    Δυστυχώς στην ανάγκη να μπορώ να ακυρώσω την εκτέλεση της συνάρτησης, αποφάσισα να ξηλώσω την static υλοποίηση και να χρησιμοποιήσω instance οπότε
    αυτό που μου πρότεινες, αν και για την προηγούμενη κατάσταση βόλευε, για την τρέχουσα δεν βολεύει αφού για κάθε διαφορετικό τύπο συνάρτησης πρέπει να δηλώσω
    έναν νέο TimedExecutioner<Τ>.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    public delegate void FuctionCall(params object[] pars);
    
    public class TimedExecutioner: Timer
            {
                private bool canExecute = true;
                private FuctionCall FuncToCall;
                private object[] FuncPars = null;
    
                public TimedExecutioner()
                {
                    
                }
    
                protected override void OnTick(EventArgs e)
                {
                    base.OnTick(e);
                    
                    if(canExecute)
                        FuncToCall(FuncPars);                
                    
                    this.Stop();
    
                    this.FuncToCall = null;
                    this.FuncPars = null;
                    this.Interval = 1;
                }
                public void ExecFunctionInTime(int mSecs, FuctionCall func, params object[] FuncPars)
                {
                    this.FuncToCall = func;
                    this.FuncPars = FuncPars;
                    this.Interval = mSecs;
                    this.Start();
                }
                public void CancelPendingExecution()
                {
                    canExecute = false;
                }
            }

    Anjelinio
    Χρησιμοποιώ v3.5 αλλά για να είμαι ειλικρινής δεν έχω ιδέα από delta expressions ούτε linq καθώς δεν παίζω με ΒΔ εδώ και καιρό (έχω αρχίσει ήδη όμως να το ψάχνωSmile). Από λίγο που διάβασα, κατάλαβα τί παίζει με το delta και πώς θα γίνει η κλήση αλλά δεν κατάλαβα στην class πώς θα διαμορφωθεί η κατάσταση και πώς μπορεί να επιστραφεί και η int τιμή στην περίπτωση που ανέφερες. Πάντως βασικά με ενδιαφέρει η κλήση void συναρτήσεων οπότε και να μην καλύπτω τον επιστρεφόμενο τύπο δεν πειράζει(όχι ότι δεν έχω περιέργια πώς γίνεται Embarrassed )

    Ευχαριστώ
  •  21-03-2009, 21:06 49495 σε απάντηση της 49469

    Απ: Πέρσμα συνάρτησης ώς παραμέτρος σε συνάρτηση, χωρίς να με νοιάζει ο τύπος της.

    Είχα κάνει κι εγώ στο παρελθόν κάτι παρόμοιο, δες αυτό, μήπως σε βοηθήσει σε κάτι. Το'χα post-άρει γιατί ήταν καλή ιδέα.

    Angel
    O:]
  •  21-03-2009, 21:52 49499 σε απάντηση της 49469

    Απ: Πέρσμα συνάρτησης ώς παραμέτρος σε συνάρτηση, χωρίς να με νοιάζει ο τύπος της.

    Τι ακριβώς περνάς στο object[] array; θέλω να πω, οι παράμετροι είναι όλοι του ιδίου type, π.χ. όλοι int ή όλοι string; Μήπως πριν καταφύγεις στη χρήση του Func ή του Action delegate να φτιάξεις μία κλάση Parameters για να περνάς τις παραμέτρους, αντί του object[] array; Κάτι τέτοιο θα σε διευκολύνει να κρατάς τους διαφορετικούς τύπους σε χωριστές λίστες (π.χ. List<int>, List<string> κ.λπ.) ή χωριστά arrays.
    Ακόμα κι ένας άνθρωπος μπορεί ν' αλλάξει τον κόσμο. Μη θέλεις να κυβερνήσεις. Απλά δείξε το μονοπάτι κι ο κόσμος θ' ακολουθήσει!!
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems