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

 

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

Class member by name

Îåêßíçóå áðü ôï ìÝëïò M1ke. Τελευταία δημοσίευση από το μέλος Παναγιώτης Καναβός στις 23-01-2009, 01:03. Υπάρχουν 6 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  22-01-2009, 08:26 47808

    Class member by name

    Γειά σε όλους!

    Πολλές φορές έχει τύχει να χρειάζομαι ένα enumerator με όλα τα πεδία της class, ώστε μετά να την χειριστώ όπως τα columns ενός dataset

    class CustomClass
    {
       int x,y;
       string s,v;
    }


    ...

    CustomClass custom = new CustomClass();

    foreach (object o in custom.<IDoNotKnowHow>)
    {
    ...Do something
    }


    ή

    custom["x"] = 5;

    Υπάρχει τρόπος να γίνει κάτι τέτοιο? Θα μου φαινόταν αρκετά χρήσιμο όταν αρχικοποιώ ένα instance από μία βάση, ώστε να τρέχω ένα loop που 8α παίρνω το όνομα του εκάστοτε column του datatable και θα αναθέτω την τιμή του στο αντίστοιχο member της κλάσης.

    I think there's to much blood in my caffeine system..
  •  22-01-2009, 09:24 47809 σε απάντηση της 47808

    Απ: Class member by name

    Καταρχήν, αυτό που ζητάς γίνεται ήδη με το Linq to SQL, το Entity Framework ή κάποιο άλλο ORM. Από εκεί και πέρα, μπορείς να χρησιμοποιήσεις Reflection για να βρεις τα members ενός τύπου, τα attributes που περιέχουν κλπ. Αυτο γίνεται με την Type.GetProperties, Type.GetMembers και τις άλλες μεθόδους του Type class. H GetProperties θα σου επιστρέψει μία λίστα από PropertyInfo αντικείμενα τα οποία αντιπροσωπεύουν τα properties ενός τύπου. Την τιμή του Property τη βρίσκεις με την PropertyInfo.GetValue και τη θέτεις με την PropertyInfo.SetValue.

    Έχε υπόψη όμως ότι το Reflection αργεί. Είναι πολύ γρηγορότερο να δουλεύεις με ένα property απευθείας παρά μέσω Reflection. Γι αυτό και τα ORMs δεν χρησιμοποιούν reflection αλλά mappings ή code generation για να δημιουργήσουν κλάσεις παρά να τις γεμίσουν από ένα πίνακα.


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  22-01-2009, 09:31 47810 σε απάντηση της 47808

    Απ: Class member by name

    Φίλε M1ke, για να πετύχεις κάτι τέτοιο πρέπει να κάνεις
    implement δύο interface, το IEnumerable και το IEnumerator
    ώστε να γίνει iterative η κλάση σου.
    Δές εδώ, είναι σχετικά εύκολο να το πετύχεις.

    http://support.microsoft.com/kb/322022

  •  22-01-2009, 10:02 47811 σε απάντηση της 47810

    Απ: Class member by name

    gtas, αυτό που λες χρησιμοποιείται αν θέλει κανείς να έχει πρόσβαση στα αντικείμενα μίας λίστας. Ο M1ke όμως ζήτησε να έχει πρόσβαση στα properties ενός αντικειμένου. Κάτι τέτοιο δεν μπορεί να γίνει με enumerators.


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  22-01-2009, 10:41 47814 σε απάντηση της 47811

    Απ: Class member by name

    Sorry, my bad...
    :)

  •  23-01-2009, 00:21 47835 σε απάντηση της 47814

    Απ: Class member by name

    Εφόσον μου είπες ότι αργεί το Reflection τότε απάντησες και στην επόμενη απορία μου! Απλά ήταν η πρώτη φορά που δούλευα το Remoting, με ένα winforms client να μιλάει σε ένα windows service για τις παραμέτρους λειτουργίας του, οπότε και στο service OnPropertyChanged έβαζα τις τιμές του αλλαγμένου πεδίου στο settings.. Δεν ήταν εύλογο να ζητήσω:

    Properties.Settings.Default[e.PropertyName] = remotableObject[e.PropertyName] ?

    Επίσης σκέφτηκα το άλλο. Αν κρατήσω ένα Dictionary<string, Object> με το key να είναι το όνομα του πεδίου και <Object> η τιμή του (η καλύτερα ένα ref στο πεδίο) θα είναι σωστό? Η απλά (και για απλούς τύπους δεδομένων) να κάνω ένα interface αλα INotifyPropertyChanged και να περνάω και to value στο EventArgs?

    I think there's to much blood in my caffeine system..
  •  23-01-2009, 01:03 47836 σε απάντηση της 47835

    Απ: Class member by name

    Μήπως το κάνεις εξαιρετικά περίπλοκο? Κάθε κλήση στο remoting αντικείμενο είναι άλλη μία κλήση μέσω δικτύου. Είναι ό,τι πιο αργό μπορείς να κάνεις. Το ευκολότερο είναι να ζητήσεις από το service ένα dictionary με τα settings και μετά να γράψεις

    foreach (KeyValuePair<string,object> item in settings)
    {
       Properties.Settings.Default[item.Key] = item.Value;
    }


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems