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

 

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

Ambigous match σε property defined με "new" ...

Îåêßíçóå áðü ôï ìÝëïò anjelinio. Τελευταία δημοσίευση από το μέλος anjelinio στις 17-03-2006, 13:13. Υπάρχουν 8 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  15-03-2006, 11:36 10674

    Ambigous match σε property defined με "new" ...

    Καλημέρα παιδιά, έχω ένα ενδιαφέρον πρόβλημα σήμερα ...

    Έχω μια κλάσση η οποία είναι subclass μιάς άλλης, η οποία (ο parent) ορίζει το εξής property:

    public virtual byte[] Value {

                get {
                    // Check for needs initialization ...
                    if (m_RequiresInit)
                        Initialize(m_FilePath);

                    // ok, now return the contents of the file
                   
    return m_FileBuffer.ToArray();
                }
            }


    Στο δικό μου subclass όμως, θέλω να "κρύψω" αυτό το property, και να γυρίζω διαφορετικό Type:

    public new XmlDocument Value {

        get {
             return m_Document;
        }
    }

    Τί γίνεται τώρα όμως .. :( ... άν προσπαθήσω με reflection να πάρω το value αυτού του property, λόγω του ότι η base και η subclass έχουν το ίδιο property, τρώω ένα "Ambigous Match found" Exception ... και λογικό είναι ...

    // Get the handler ...
    object handler =  GetHandler(handlerKey);

    // Get the runtime type, and call 'Value' on it ..
    Type handlerType = handler.GetType();
    PropertyInfo valueProp = handlerType.GetProperty("Value");

    return valueProp.GetValue(handler, null);


    Το επόμενο που σκέφτηκα ήταν να καλέσω το GetProperty με BindingFlags.DeclaredOnly ( κάνει evaluate μόνο τα members του runtime type, όχι του base class), αλλά απέτυχα οικτρά, μου δίνει πίσω null reference ...

    Κάποια ιδέα;

    Angel
    O:]
  •  15-03-2006, 12:12 10677 σε απάντηση της 10674

    Απ: Ambigous match σε property defined με "new" ...

    ... και θα προτιμούσα σε πρώτη φάση να αποφύγω τα custom attributes στην κλάσση για να δείχνω το return type του property.
    Angel
    O:]
  •  15-03-2006, 19:46 10694 σε απάντηση της 10674

    Απ: Ambigous match σε property defined με "new" ...

     anjelinio wrote:
    Το επόμενο που σκέφτηκα ήταν να καλέσω το GetProperty με BindingFlags.DeclaredOnly ( κάνει evaluate μόνο τα members του runtime type, όχι του base class), αλλά απέτυχα οικτρά, μου δίνει πίσω null reference ...

    Δοκίμασε στα BindingFlags να προσθέσεις και τα GetProperty, Instance, Public.

     


    Νατάσα Μανουσοπούλου
  •  16-03-2006, 12:36 10710 σε απάντηση της 10674

    Απ: Ambigous match σε property defined με "new" ...

    Δυστυχώς ... όχι. Όλοι οι πιθανοί συνδιασμοί με απογοήτευσαν :P



    Οπότε ... το 'ριξα στα CustomAttributes και έπαιξε. Απλώς μου τη σπάνε τα CustomAttributes, είναι πιο αργή διαδικασία, και με βάζει τώρα στο τριπάκι να τα cache-άρω, που με τη σειρά του με βάζει στη διαδικασία να σκέφτομαι τι και πώς θα γίνει αν κάποια στιγμή αλλάξω αυτά τα attributes κτλ κτλ κτλ .. φαύλος κύκλος.



    Τέλος πάντων, όμως, τί να κάνουμε ... ευχαριστώ για την προσπάθεια mns, βασικά το δικό σου reply περίμενα να δώ όταν έκανα το post χτές :D
    Angel
    O:]
  •  16-03-2006, 17:44 10721 σε απάντηση της 10674

    Απ: Ambigous match σε property defined με "new" ...

    Αααα, δεν πρέπει να τα παρατάμε τόσο εύκολα Smile [:)]



    System.Reflection.MemberInfo[] ms = handlerType.GetMember("Value");
    for (int index=0; index<ms.Length; ++index)
     if (ms[index].DeclaringType == handlerType)
     {
      ...
     }


    Νατάσα Μανουσοπούλου
  •  16-03-2006, 19:45 10731 σε απάντηση της 10721

    Απ: Ambigous match σε property defined με "new" ...

    :D .. lol ! .. σωστή !!! Πίεση χρόνου αγαπητή, τί να κάνεις.



    Σε ευχαριστώ, θα το δώ κι έτσι.
    Angel
    O:]
  •  16-03-2006, 20:05 10734 σε απάντηση της 10731

    Απ: Ambigous match σε property defined με "new" ...

    Απογοήτευση ... το πεντάλεπτο τέστ:

    MemberInfo[] members = handlerType.GetMember("Value");

    MemberInfo valueMember = null;

    int index = 0;

    bool found = false;

    while(!found && index<members.Length){


        found = (members[index].DeclaringType==handlerType && members[index].MemberType== MemberTypes.Property);

        valueMember = members[index];

        index++;

    }

         // If found, return the value, otherwise signal error

         if(found){

            PropertyInfo valueProp = handlerType.GetProperty(valueMember.Name, valueMember.<Ποσο θα ήθελα να μου έλεγε κάπως το Type του member εδώ ... >);

            return valueProp.GetValue(handler, null);

        }

        else

            throw new Exception(string.Format("Could not locate Value property on type: {0}", handlerType.ToString()));


    Όπως βλέπεις, ακόμη και έτσι, δεν έχω τρόπο να πάρω το value του property - με κάθε επιφύλαξη βέβαια γιατί είναι .. το πεντάλεπτο τέστ :D
    Προς το παρόν ... τα custom attributes παραμένουν

    Angel
    O:]
  •  16-03-2006, 23:08 10742 σε απάντηση της 10710

    Απ: Ambigous match σε property defined με "new" ...

    Η πληροφορία υπάρχει τελικά, αλλά θα πρέπει να ψάξεις λίγο για να τη βρεις. Η κλάση MethodBase, στην οποία βασίζεται η MethodInfo, περιέχει το property NewSlot. Με το property αυτό μαρκάρονται τα methods τα οποία ορίζονται με το new modifier στη C# και το shadows στη Visual Basic. Μόνο που ..

    Η GetProperty επιστρέφει ένα PropertyInfo, το οποίο δεν κάνει inherit την MethodBase! Φτού?

    Όχι ακριβώς. Η PropertyInfo έχει τις μεθόδους GetGetMethod και GetSetMethod οι οποίες επιστρέφουν τα MethodInfo που αντιστοιχούν στις μεθόδους get και set του property. Αυτά μπορείς να τα ελέγξεις για να δεις αν έχουν οριστεί με new.

    Πρόσεξε μόνο ότι η συμπεριφορά του new στη C# και του Shadows στη VB είναι διαφορετική και επηρεάζει τα αποτελέσματα που θα πάρεις. Το new modifier κρύβει μόνο τη μέθοδο που έχει το ίδιο signature με την αρχική. Το Shadows κρύβει όλες τις μεθόδους που κληρονομούνται και έχουν το ίδιο όνομα.



    Όλη αυτή η μανούβρα είναι μπελάς αλλά έχει μία κάποια λογική. Όσον αφορά το runtime, οι get, set είναι μέθοδοι με ειδική συμπεριφορά. Συνεπώς οι πληροφορίες τους επιστρέφονται από την κλάση MethodInfo αντί για την PropertyInfo. Το new modifier εφαρμόζεται στις μεθόδους αυτές και όχι στο property. Αν τα έλεγε όλα αυτά και στο documentation ...

    Duh!
    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  17-03-2006, 13:13 10763 σε απάντηση της 10734

    Απ: Ambigous match σε property defined με "new" ...

    Είσαι ωραίος Καναβέ .. αλλά μετά απο "ώριμη" σκέψη κατέληξα στο ότι οκ, αυτό θα δούλευε μια χαρά, ΑΛΛΑ ...



    .. δεν μπορώ να βασίζομαι στο ότι οποιοσδήποτε wannabe subclasser θα ορίσει το property ως new / shadows. That's extremely gay on my part.



    Μπορώ όμως πολύ όμορφα στη base class να ελέγχω αν υπάρχει custom attribute ορισμένο στον subclass type. Επίσης, το custom attribute μπορεί να περιέχει το όνομα της method / property / field που μου επιστρέφει το value που θέλω ( που θέλει ο subclasser τέλος πάντων ... ), καθώς και τον Type του value. Οπότε ... total decoupling. Τώρα, ίσως κάνω force τον subclasser κάνοντας τη base class abstract και τον βάλω να κάνει implement τα αντίστοιχα properties και σκοτώσω και τα custom attributes altogether .. είδωμεν !



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