none
funzione che ritorna liste di tipo diverso RRS feed

  • Domanda

  • Buonasera

    mi scuso per il titolo cerco di spiegarmi meglio:

    Utilizzo c# sotto Visual studio Express 2012

    Ho una classe statica dove sono presenti 5 liste di tipo oggetti diversi.

    List<obj1> = list1 = new List<obj1>

    List<obj2> = list2 = new List<obj2>

    List<obj2> = list2 = new List<obj2>

    ...

    diverse volte nel mio software ho la necessità di andare a interrogare le liste con un codice per recuperare l'oggetto al loro interno.

    Volevo fare una funzione nella classe statica che mi ritorni la lista o direttamente l'oggetto.

    public static xxxx getElement(string code)

    come posso fare?

    grazie

    Gianluca

    lunedì 22 ottobre 2012 15:11

Risposte

  • Ciao usa i generics:

            static List<t> GetElement<t>(string code)
                where T : class
            { 
                // a è il tipo della tua lista
                var ra = a as List<t>;
                if (ra != null)
                    return ra;
    
                // b è il tipo della tua lista
                var rb = b as List<t>;
                if (ra != null)
                    return rb;
    
                // c è il tipo della tua lista
                var rc = c as List<t>;
                if (ra != null)
                    return rc;
    
                return null;
            }
    </t></t></t></t></t>
    la funzione ritorna l'oggetto intero indietro ma ti basta applicare il filtro per "code" o quello che ti serve. Maurizio

    • Proposto come risposta Maurizio Cinti giovedì 25 ottobre 2012 14:16
    • Modificato Maurizio Cinti giovedì 25 ottobre 2012 14:18
    • Contrassegnato come risposta Irina Turcu martedì 6 novembre 2012 23:07
    giovedì 25 ottobre 2012 14:16
  • Ciao Gianluca,

    Puoi sempre lavorare con i tipi generici per fare quello che ti serve, ti basta recuperare il tipo degli elementi nella lista e poi creare un’istanza di quel tipo.

    Ad esempio, per estrare il tipo degli elementi nella lista, puoi usare il metodo Type.GetGenericArguments, così:

    Type type1 = list1.GetType().GetGenericArguments()[0];

    Per poi crearti un’istanza di quel tipo, puoi usare il metodo Activator.CreateInstance(Type). Questo metodo crea un’istanza del tipo specificato come parametro utilizzando il costruttore predefinito di tale tipo. Un esempio:

    var a = Activator.CreateInstance(type1);

    Attenzione però al fatto che, implicitamente, CreateInstance(Type) cerca di usare il costruttore implicito senza parametri, quindi non funzionerà per il tipo String, oppure se il tuo tipo custom (se ne usi uno) non ha un costruttore senza parametri. Puoi scegliere tra i vari metodi overload di CreateInstance per identificare quello che funziona meglio nel tuo caso, il costruttore utilizzato sarà quello più adatto ai parametri specificati (ad esempio per crearti un'istanza della classe String, vedi questa soluzione).

    Per sapere a quale lista fare riferimento quando recuperare il tipo, potresti passarla come secondo parametro nel tuo metodo getElement.


    Irina Turcu - Microsoft

    [Manifesto] Regole e Aspetti generali all'uso dei forum MSDN

    Questo contenuto è distribuito “as is” e non implica alcuna responsabilità da parte di Microsoft. L'azienda offre questo servizio gratuitamente, allo scopo di aiutare gli utenti e approfondire la loro conoscenza dei prodotti e tecnologie Microsoft.

    LinkedIn


    • Modificato Irina Turcu giovedì 25 ottobre 2012 14:54 Aggiornamento codice.
    • Contrassegnato come risposta Irina Turcu martedì 6 novembre 2012 23:07
    giovedì 25 ottobre 2012 14:53

Tutte le risposte

  • sto provando a dichiararla così:

    public static Object getElement(string Code)
    {	
       Object obj = new Object();
       obj1 element = list1.Find(rs => rs.DeviceCode == Code)
       if (element != null)
           obj = (Object)element;
       obj2 element = list2.Find(rs => rs.DeviceCode == Code)
       if (element != null)
           obj = (Object)element;
       return obj;
    }
    Naturalmente il codice ricercato è univoco in tutte le liste



    • Modificato Gian7474 lunedì 22 ottobre 2012 15:56
    lunedì 22 ottobre 2012 15:34
  • Adesso ho il problema a convertire da Object a obj1, obj2  quando utilizzo la funzione...

    buio..

    lunedì 22 ottobre 2012 15:55
  • Ciao usa i generics:

            static List<t> GetElement<t>(string code)
                where T : class
            { 
                // a è il tipo della tua lista
                var ra = a as List<t>;
                if (ra != null)
                    return ra;
    
                // b è il tipo della tua lista
                var rb = b as List<t>;
                if (ra != null)
                    return rb;
    
                // c è il tipo della tua lista
                var rc = c as List<t>;
                if (ra != null)
                    return rc;
    
                return null;
            }
    </t></t></t></t></t>
    la funzione ritorna l'oggetto intero indietro ma ti basta applicare il filtro per "code" o quello che ti serve. Maurizio

    • Proposto come risposta Maurizio Cinti giovedì 25 ottobre 2012 14:16
    • Modificato Maurizio Cinti giovedì 25 ottobre 2012 14:18
    • Contrassegnato come risposta Irina Turcu martedì 6 novembre 2012 23:07
    giovedì 25 ottobre 2012 14:16
  • Ciao Gianluca,

    Puoi sempre lavorare con i tipi generici per fare quello che ti serve, ti basta recuperare il tipo degli elementi nella lista e poi creare un’istanza di quel tipo.

    Ad esempio, per estrare il tipo degli elementi nella lista, puoi usare il metodo Type.GetGenericArguments, così:

    Type type1 = list1.GetType().GetGenericArguments()[0];

    Per poi crearti un’istanza di quel tipo, puoi usare il metodo Activator.CreateInstance(Type). Questo metodo crea un’istanza del tipo specificato come parametro utilizzando il costruttore predefinito di tale tipo. Un esempio:

    var a = Activator.CreateInstance(type1);

    Attenzione però al fatto che, implicitamente, CreateInstance(Type) cerca di usare il costruttore implicito senza parametri, quindi non funzionerà per il tipo String, oppure se il tuo tipo custom (se ne usi uno) non ha un costruttore senza parametri. Puoi scegliere tra i vari metodi overload di CreateInstance per identificare quello che funziona meglio nel tuo caso, il costruttore utilizzato sarà quello più adatto ai parametri specificati (ad esempio per crearti un'istanza della classe String, vedi questa soluzione).

    Per sapere a quale lista fare riferimento quando recuperare il tipo, potresti passarla come secondo parametro nel tuo metodo getElement.


    Irina Turcu - Microsoft

    [Manifesto] Regole e Aspetti generali all'uso dei forum MSDN

    Questo contenuto è distribuito “as is” e non implica alcuna responsabilità da parte di Microsoft. L'azienda offre questo servizio gratuitamente, allo scopo di aiutare gli utenti e approfondire la loro conoscenza dei prodotti e tecnologie Microsoft.

    LinkedIn


    • Modificato Irina Turcu giovedì 25 ottobre 2012 14:54 Aggiornamento codice.
    • Contrassegnato come risposta Irina Turcu martedì 6 novembre 2012 23:07
    giovedì 25 ottobre 2012 14:53