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

 

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

Εύρεση πεδίων μιας κλάσης από static μέθοδο.

Îåêßíçóå áðü ôï ìÝëïò alfoks. Τελευταία δημοσίευση από το μέλος anjelinio στις 15-05-2008, 17:23. Υπάρχουν 12 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  14-05-2008, 13:53 41985

    Εύρεση πεδίων μιας κλάσης από static μέθοδο.

    Hello!

    Έχω μια κλάση έστω a

    public class a {
        public int nField;

        public static string StaticMethod() {
        }
    }

    και κλάσεις (b, c) που κάνουν inherit από αυτήν με επιπλέον πεδία η κάθε μια.

    Κάποια στιγμή καλώ b.StaticMethod() ή c.StaticMethod(). Σε αυτό το σημείο μέσα στην StaticMethod θέλω να βρώ τον τύπο της κλάσης
    που έκανε την κλήση, ώστε να πάρω με Reflection τα πεδία της. Αν η StaticMethod δεν ήταν static θα μπορούσα να πω απλά GetType().


  •  14-05-2008, 14:24 41988 σε απάντηση της 41985

    Απ: Εύρεση πεδίων μιας κλάσης από static μέθοδο.

    Αυτό που ζητάς δεν έχει σχέση με το Reflection. Το Reflection σου λέει ποιά members έχει μία κλάση διαβάζοντας τα metadata που υπάρχουν σε ένα DLL. Αυτό που ζητάς εσύ έχει να κάνει με το πως εκτελείται ο κώδικας της εφαρμογής και συγκεκριμένα, με το call stack της κάθε κλήσης. Αυτό το functionality κατά κανόνα θα το βρεις στο System.Diagnostic.

    Τον caller μίας μεθόδου μπορείς να τον βρεις χρησιμοποιώντας τις κλάσεις System.Diagnostic.StackTrace και System.Diagnostic.StackFrame. Το documentation της StackTrace έχει παραδείγματα για το πως μπορείς να βρεις από ποιές μεθόδους έχει περάσει μία κλήση μέχρι να φτάσει στη μέθοδο σου. Με την StackTrace.GetFrame(1) παίρνεις πληροφορίες για αυτόν που κάλεσε απευθείας τη μέθοδο σου.

    Δες και το Exploring the Call Stack Programmatically που περιγράφει την ίδια διαδικασία


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  15-05-2008, 10:08 41999 σε απάντηση της 41985

    Απ: Εύρεση πεδίων μιας κλάσης από static μέθοδο.

    Αν δε σε εμποδίζει κάτι πραγματικά σοβαρό να κάνεις τη μέθοδό σου instance από static, κάνε το. Έτσι θα αποφύγεις το stack walk που έχει αυξημένα security permission demands.

     


    Νατάσα Μανουσοπούλου
  •  15-05-2008, 11:27 42005 σε απάντηση της 41999

    Απ: Εύρεση πεδίων μιας κλάσης από static μέθοδο.

    Θα συμφωνήσω με την Νατάσα...και να τονίσω ότι έχει και απίστευτα κακό performance (Με έχει "δαγκώσει" μια φορα)

    Palladinos Nick
    Software Engineer
    -----------------------
    The limits of my language mean the limits of my world. (Ludwig Wittgenstein)
  •  15-05-2008, 11:33 42006 σε απάντηση της 42005

    Απ: Εύρεση πεδίων μιας κλάσης από static μέθοδο.

    Παιδιά, πως θα βρει κανείς τον caller μίας μεθόδου με την GetType ?


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  15-05-2008, 12:19 42010 σε απάντηση της 41985

    Απ: Εύρεση πεδίων μιας κλάσης από static μέθοδο.

    εμ, θα μπορούσες να προσθέσεις μια επιπλέον παραμέτρο στην StaticMethod, με την οποία θα περνάς το Type του object που την καλεί.

    πχ. b.StaticMethod(typeof(b))

    δεν μου φαίνεται όμορφο/κομψό αλλά μάλλον είναι αρκετά efficient.

     

  •  15-05-2008, 13:30 42014 σε απάντηση της 42010

    Απ: Εύρεση πεδίων μιας κλάσης από static μέθοδο.

    Να ρωτήσω και το άλλο, πού χρειάζεται να ξέρει κανείς ποιός καλεί μία μέθοδο? Το σενάριο έχει μεγάλη σημασία για το πως θα βρει κανείς τον caller αλλά και για το αν χρειάζεται καν να τον βρει.
    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  15-05-2008, 13:55 42016 σε απάντηση της 42014

    Απ: Εύρεση πεδίων μιας κλάσης από static μέθοδο.

    Εάν η ερώτηση σου είναι γενική, μπορώ να απαντήσω σύμφωνα με την δικη μου περίπτωση... Το StackTrace το πρωτοσυνάντησα όταν μελετούσα το source code του CSLA (δες PropertyHasChanged())... το ακολούθησα και εγώ στο δικό μου framework... αλλα γρήγορα το εγκατέλειψα...(ενοχλητικό performace... και inlining issues)


    Palladinos Nick
    Software Engineer
    -----------------------
    The limits of my language mean the limits of my world. (Ludwig Wittgenstein)
  •  15-05-2008, 15:38 42021 σε απάντηση της 42016

    Απ: Εύρεση πεδίων μιας κλάσης από static μέθοδο.

    Και πως το χρησιμοποιεί μάλιστα ... επειδή βαριέται να περάσει το όνομα του Property! Έχει και άλλα τέτοια "καλούδια" το CSLA. Αυτό πάντως είναι ένα παράδειγμα περίπτωσης όπου ΔΕΝ πρέπει να χρησιμοποιείς το StackTrace αλλά να βρεις άλλη λύση!

    Όσον αφορά το αρχικό ερώτημα. Ο άνθρωπος ρώτησε πως να βρει τον caller. Αυτό γίνεται με την StackTrace. Με άλλο τρόπο γίνεται?


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  15-05-2008, 15:49 42023 σε απάντηση της 42021

    Απ: Εύρεση πεδίων μιας κλάσης από static μέθοδο.

    Και αμέσως μετά μου ήρθε, άλλος ένας "περίεργος" τρόπος, για να κάνεις αυτό που κάνει το CSLA στην PropertyHasChanged. Η PropertyHasChanged έχει δύο εκδόσεις, μία η οποία δέχεται σαν παράμετρο το όνομα του property και μία με το StackTrace που κάνει όλη αυτή τη μανούβρα για να βρει το όνομα του property μέσω της StackTrace και να καλέσει μετά την πρώτη εκδοχή. Βέβαια, πάλι θα πρέπει κανείς να πάει σε όλα τα property set και να γράψει PropertyHasChanged(), οπότε το μόνο που κερδίζει κανείς είναι ότι μπορεί να κάνει copy/paste αυτή τη γραμμή.

    Κάτι παρόμοιο μπορεί να πετύχει κανείς με την MethodBase.GetCurrentMethod().Name η οποία επιστρέφει το όνομα της τρέχουσας μεθόδου. Έτσι η PropertyHasChanged γίνεται PropertyHasChanged(MethodBase.GetCurrentMethod().Name) . Πετυχαίνει το ίδιο αποτέλεσμα με καλύτερες (όχι όμως καλές) επιδόσεις και παίζει και το copy/paste.

     

    Υ.Γ. Ο κώδικας της PropertyHasChanged είναι ...

    [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
    [Obsolete("Use overload requiring explicit property name")]
    protected void PropertyHasChanged()
    {
       string propertyName = new System.Diagnostics.StackTrace().GetFrame(1).GetMethod().Name.Substring(4);
       PropertyHasChanged(propertyName);
    }

    οπότε μάλλον το καταλάβανε ότι η ιδέα ήταν κακή.

     


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  15-05-2008, 15:53 42024 σε απάντηση της 42021

    Απ: Εύρεση πεδίων μιας κλάσης από static μέθοδο.

    Μάλλον θα ακουστεί άσχημο και κακό και παλιομοδίτικο, αλλά ένα enum των κλάσεων δεν αρκεί?

    int classtype στην "a" και μεταβολή αυτής στον constructor των inhereted.


    I think there's to much blood in my caffeine system..
  •  15-05-2008, 16:41 42025 σε απάντηση της 42021

    Απ: Εύρεση πεδίων μιας κλάσης από static μέθοδο.

    Ας μη βρει τον caller. Ας κάνει τη μέθοδο instance και να λύσει το πρόβλημά του με ένα φτηνό και ταπεινό this.GetType().


    Νατάσα Μανουσοπούλου
  •  15-05-2008, 17:23 42027 σε απάντηση της 42025

    Απ: Εύρεση πεδίων μιας κλάσης από static μέθοδο.

    ... θα συμφωνήσω κι εγώ με τη Νατάσσα. Αν μια static μέθοδος χρειάζεται να ξέρει ποιός είναι ο caller της, και να πράττει ανάλογα ... κάτι βρωμάει εδώ.


    Υ.Γ. Κι επειδή ο άνθρωπος ο οποίος ξεκίνησε το thread δε φαίνεται να έχει πεί κάτι εδώ και καιρό, νομίζω ότι ματαιοπονούμε σε αυτό το thread πια, ε;  :D

    Angel
    O:]
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems