Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    [c#] Recuperare il valore di un campo "private" con GetType().GetFields

    Salve a tutti,
    come da titolo :

    ho una classe User con un campo username dichiarato come private.
    Ho dichiarato un metodo get username per recuperarne il valore.
    codice:
    public class User     
    { 
       private string _username;             
       public string username             
               { get { return _username; } }
    in un'altra classe faccio una ricerca tra i campi per recuperarne il valore


    codice:
    FieldInfo[] fields = data.GetType().GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
                foreach (FieldInfo f in fields)
    {
     if (f.Name == MIONOMECAMPO )
     // RECUPERO IL VALORE DEL CAMPO 
    }
    lo faccio perchè il codice è parte di una classe generica che fa delle operazioni su file in cui il tipo record non è fissato...nel mio caso è di tipo User...


    Il problema è che il codice funziona solo se

    MIONOMECAMPO è una stringa uguale a "_username"

    cioè il nome del campo privato.

    ma io non voglio questo..altrimenti a che serve averlo privato se posso accedervi così ...tramite il nome..

    voglio invece accedere lo renderei publico
    MIONOMECAMPO ="username"

    e' possibile farlo? come faccio a recuperare il valore di username...cioè di ?
    _username ..
    spero di essere statao chiaro e che le informazioni siano sufficienti.

    grazie.

  2. #2
    Utente di HTML.it L'avatar di U235
    Registrato dal
    Mar 2006
    Messaggi
    1,536
    Ciao,
    non so se sia la mia impressione ma mi pare un po "confusa" la tua richiesta...
    da quello che ho capito io vuoi accedere alla proprietà (in lettura) username, ma se è così perché tramite reflection prendi i campi? devi usare le proprietà non i campi...
    Inoltre non è necessario scorrere tutte le proprietà (o campi) tramite ciclo, ti basta chiamare la singola proprietà :

    codice:
    User u = new User(); //vedi tu per impostare il contenuto di _username, se no è null...
    PropertyInfo pi = u.GetType().GetProperty("username");
                var username = pi.GetValue(u);
    anche se il tutto non ha molto senso visto così...

  3. #3
    Ok, grazie.

    ho semplificato la funzione .
    era un po ingarbugliata perchè ho fatto diversi tentativi.

    Il mio errore era che appunto usavo i campi e non le proprietà ed ho corretto (grazie).

    Ora la funzione in pratica è la seguente

    codice:
      
    private bool getRecordFieldAsString(T data, string Key, out string campoLetto)         
    {              
            PropertyInfo pi = data.GetType().GetProperty(Key);
            campoLetto = pi.GetValue(data);
    
    // controlli vari...
    // ecc ecc
    // ritorno funzione in base ai controlli..
    
    }
    però su questo porzione di codice mi da errore sul GetValue

    Nessun Overload del Metodo 'GetValue' accetta argomenti '1'

    Il parametro data è di tipo generico T (classe generica e nel mio caso T sarebbe il tipo User )....altrimenti accederei direttametne alla proprietà ..

    che può essere?... nella definizione di GetValue...c'è anche quella con un solo parametro...ma non mi da errore.

  4. #4
    Utente di HTML.it L'avatar di U235
    Registrato dal
    Mar 2006
    Messaggi
    1,536
    Originariamente inviato da maurodefilippis
    Ok, grazie.

    ho semplificato la funzione .
    era un po ingarbugliata perchè ho fatto diversi tentativi.

    Il mio errore era che appunto usavo i campi e non le proprietà ed ho corretto (grazie).

    Ora la funzione in pratica è la seguente

    codice:
      
    private bool getRecordFieldAsString(T data, string Key, out string campoLetto)         
    {              
            PropertyInfo pi = data.GetType().GetProperty(Key);
            campoLetto = pi.GetValue(data);
    
    // controlli vari...
    // ecc ecc
    // ritorno funzione in base ai controlli..
    
    }
    però su questo porzione di codice mi da errore sul GetValue

    Nessun Overload del Metodo 'GetValue' accetta argomenti '1'

    Il parametro data è di tipo generico T (classe generica e nel mio caso T sarebbe il tipo User )....altrimenti accederei direttametne alla proprietà ..

    che può essere?... nella definizione di GetValue...c'è anche quella con un solo parametro...ma non mi da errore.
    Figurati.

    per risponderti al meglio dovrei vedere il resto della classe, così rilevo 2 errori, ovvero :

    codice:
    getRecordFieldAsString<T>(T data, string Key, out string campoLetto)
    a meno che non sia la tua classe a definire T (class MiaClasse<T>)

    mentre il secondo è che manca il cast da object a string :
    codice:
    campoLetto = (string)pi.GetValue(data);
    ma questo :
    Nessun Overload del Metodo 'GetValue' accetta argomenti '1'
    non dovrebbe esserci...
    prova a postare il resto della classe.

  5. #5
    Ciao ,
    entrambe le tue annotazioni sono già nel codice.

    La classe di partenza è


    codice:
     
    using System.IO;
    using System.Runtime.Serialization.Formatters.Binary;
    using System.Reflection;
    
    namespace mynamespace
    {
    
    public class GenericBinaryFile <T>      
    {
        public GenericBinaryFile(string fileName) {,,,}
        
        public bool createFile() {,,,}
    
        public bool openFile() {,,,}
    
        public bool closeFile() {,,,}
    
        public bool appendRecord(T record) {,,,}
    
       
        private bool getRecordFieldAsString(T data, string Key, out string campoLetto)
            {
                PropertyInfo pi = data.GetType().GetProperty(Key);
                campoLetto =   (string) pi.GetValue((object) data);
    
                /// elaborazioni varie...
                /// elaborazioni varie...
                /// elaborazioni varie...
    
            }
    
        }
    }
    in pratica in modo generico salvo e leggo in un file un tiporecord <T>.
    per questo non accedo direttamente alle proprietà e ai metodi ma vado con .GetType().GetProperty.

    ..non mi sembra ci siano errori...

  6. #6
    Utente di HTML.it L'avatar di U235
    Registrato dal
    Mar 2006
    Messaggi
    1,536
    Originariamente inviato da maurodefilippis
    ..non mi sembra ci siano errori...
    no, infatti... non ne vedo...
    prova ad aggiungere null :
    codice:
    campoLetto =   (string) pi.GetValue(data,null);
    Che framework usi? ricordo che un problema simile me lo aveva dato usando la reflection in silverlight.

  7. #7
    ..sembra funzionare..
    ..sembra funzionare..

    prefetto
    grazie mille.

  8. #8
    Utente di HTML.it L'avatar di U235
    Registrato dal
    Mar 2006
    Messaggi
    1,536
    Originariamente inviato da maurodefilippis
    ..sembra funzionare..
    ..sembra funzionare..

    prefetto
    grazie mille.
    figurati

    io ho pensato a silverlight e/o portable class perché hanno delle dll "ridotte" e magari non possiedono l'overload con un solo argomento...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.