121 messaggi dal 08 settembre 2006
in un software scritto in vb.net ho necessità di utilizzare delle liste (list of) che ogni volta possono assumere un tipo diverso definito in una o più classi; ad esempio :

public class classe1
private campo1 as string
private campo2 as int
..
public property Campo1 as string
get
..
set..

end class

dim lista1 as new classe1

stessa cosa con lista2 di tipo classe2 che può avere struttura totalmente diversa...

poi però vorrei utilizzare una procedura centralizzata che fa delle elaborazioni sulla lista e che accetti ogni volta un tipo di lista diverso; ad esempio fare concatenazioni sui campi della lista, recuperare valori ecc. ho bisogno quindi che questa funzione centralizzata lavori con un tipo generico, per farlo penso si possano usare i generics ma non trovo un esempio specifico; qualcuno può suggerirmelo? è questa la strada giusta?
grazie
121 messaggi dal 08 settembre 2006
la mia idea è questa :

definisco il metodo con il tipo generics

public function insDati(itemdati as list(of T) as boolean
..

end function

definisco la mia lista di tipo specifico :

dim miaLista1 as classe1

chiamo la funzione passando la lista specifica

insDati(miaLista1)

allo stesso modo in un altro contesto definisco un'altra lista

dim mialista2 as classe2

chiamo sempre la stessa funzione passando la nuova lista

insDati(miaLista2)

la domanda però è la seguente :

all'interno della funzione centralizzata come faccio ad accedere ai membri specifici della lista?

cioè se miaLista1 ha le proprietà campo1, campo2 ecc. e miaLista2 ha campo3, campo4 come li distinguo dentro insDati? grazie
Modificato da bryger il 13 novembre 2017 20.22 -
10.265 messaggi dal 09 febbraio 2002
Contributi
Ciao,
essendo insDati una funzione che lavora con i generics, *non dovrebbe* interessarsi di quali proprietà esistono negli specifici tipi che le vengono passati. Il rischio è di trovarsi con un Select Case tipo questo che cresce a dismisura man mano che aumentano i tipi possibili che possono esserle passati.

Spiega bene qual è la tua necessità e perché devi interessarti delle proprietà campo1, campo2 ecc.

Se devi semplicemente concatenare i valori di tutte le proprietà pubbliche di un oggetto, puoi usare la reflection. Altrimenti, puoi far implementare un'interfaccia alle tue classi. L'interfaccia definirà un metodo "Concatenate" che ciascuna classe sceglierà di implementare a modo suo. La insDati dovrà semplicemente invocare quel metodo ed ottenere indietro una stringa.
insDati a questo punto può anche non essere generica, ma accettare un parametro del tipo dell'interfaccia.

ciao,
Moreno

Enjoy learning and just keep making
121 messaggi dal 08 settembre 2006
Grazie Moreno,
si tratta di un software un po' vecchio ed enorme che sto cercando di rimodernare, in questo caso il software, quando deve creare una query (non usa orm e attualmente non è possibile farlo), riempie un vettore/matrice con i dati utili a crearla, campi, valori, tipi ecc; la rountine insDati cicla su tale vettore e compone la query, select, insert ecc. secondo un parametro che gli viene passato in aggiunta al primo;
vorrei fare la stessa cosa ma in un modo un po' più ortodosso, dato che io uso molto le liste (list of) volevo riuscire a sfruttarle in questo modo;

di solito io faccio il contrario cioè compongo la query nel 'chiamante', form o classe business, e poi chiamo una routine centralizzata in una classe apposita generica che esegue tutti i comandi sql;
avevo pensato di usare l'interfaccia ma a parte che devo un po' stravolgere il codice, che ora usa prevalentemente moduli e non classi, resta il problema che ogni volta devo creare una diversa implementazione del metodo dell'interfaccia in base alla query che devo comporre mentre invece volevo qualcosa che fosse totalmente automatico anche se, per dirla tutta, comunque nel chiamante devo comporre l'array opportuno ogni volta quindi alla fine il lavoro lo devo fare lo stesso.

Come al solito il problema è far coesistere codice moderno contro quello vecchio con il poco tempo a disposizione per sistemarlo....

ti ringrazio per altri eventuali suggerimenti

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.