Conversione da arraylist a proprietà di una classe

giovedì 27 luglio 2006 - 20.43

massivabene Profilo | Newbie

Ciao a tutti.
Ho questa funzione:

Public Function getValue(byval table as object,by val paramCollection as Arraylist) as boolean
end Function

Table è una qualsiasi tabella, paramCollection è un array che contiene il nome di alcune proprietà della tabella.

E' possibile convertire l'array in proprietà dell'oggetto come se si scrivesse: table.proprietà in modo da recuperarne il valore?

Grazie

alx_81 Profilo | Guru

Ciao..
non capisco una cosa.. perchè tabella è un parametro object?
è un oggetto di cui non conosci la struttura a priori?
Perchè se si tratta di una struttura fissa (una tabella particolare che devi gestire), ti conviene fare la classe che identifica il tipo della tua tabella.

class miatabella 'costruttore 'proprietà 'metodi, se ci sono end class

In questo modo, poi, valorizzi solo le proprietà che ti interessano, evitando di passare un paramCollection in più..
In poche parole fai un oggetto per la tua tabella e passi alla funzione l'istanza.

Alx81 =)

http://blogs.dotnethell.it/suxstellino

massivabene Profilo | Newbie

Ti spiego esattamente qual'è il mio problema;
Dopo la chiamata alla funzione nel parametro table mi trovo la tabella che ho passato, con tutte le sue proprietà valorizzate.
Nel parametro paramCollection ho invece alcuni nomi che mi identificano la proprietà di quella tabella. Attenzione: il nome, non la proprietà.
Il mio problema sta nel convertire il nome(string) dell'arraylis in proprietà da associare alla tabella passata a parametro.
Spero di aver esposto un pò meglio il mio problema.

alx_81 Profilo | Guru

Quindi tu hai un oggetto "tabella" che passi con tutte le sue proprietà (tipo tuo o del framewok???) ed un arraylist con il nome delle proprietà che dovrai utilizzare nella funzione..
immagino..

e vorresti convertire, nella funzione, quel nome nella proprietà da tornare?
scusami, ma devo capire bene..
è come se volessi fare un'eval del nome della proprietà?
Alx81 =)

http://blogs.dotnethell.it/suxstellino

massivabene Profilo | Newbie

Vi ringrazio moltissimo dell'aiuto e vi spiego la faccenda............
Partiamo dall'inizio........
Ho una classe che ho creato e che mi serve per avere degli accessi al database.
Tra i metodi di questa classe ne ho uno che è questo:

Public Function ExecuteCommand(ByVal dataSource As String, _
ByVal sqlString As String, _
ByVal table As Object, _
ByVal listParameters As ArrayList) As Integer

If PutDatasouce(dataSource) = False Then
Throw New Exception("ExecuteCommand " & dataSource & " Nome origine dati errata")
End If
If sqlString.Length = 0 Then
Throw New Exception("ExecuteCommand " & "Manca dichiarazione Sql")
End If

Try
Open()
If provider = 0 Then
Dim cmd As New DB2Command(sqlString, cnDb2)
' **********************
Nr = cmd.ExecuteNonQuery()
Else
Dim cmd As New OleDbCommand(sqlString, cnOledb)
' **********************
Nr = cmd.ExecuteNonQuery()
End If
Return Nr
Catch e As Exception
Throw e
Finally
Close()
End Try
End Function


Nel punto dove ci sono gli asterischi vorrei inserire questa istruzione:

cmd.Parameters.Add("@" & tabella.Proprietà, tabella.proprietà.valore)

Questo oggetto non ho intenzione di ereditarlo perchè altrimenti dovrei farlo in tutte le classe che definiscono le tabelle (sbaglio?) ma viene istanziato.
"Tabella.proprietà", che è quello che mi manca, dovrei rivarlo dall'array (listParameters as Arraylist" che contiene il nome della proprietà ma che è definito string.
A questo punto, come è possibile ricavare tabella.proprietà.valore?

Spero di avervi delucidato e scusatemi ma non ho ancora sufficientemente esperienza con questo linguaggio!!!


massivabene Profilo | Newbie

Ciò che mi hai suggerito può essermi senz'altro utile in quel punto ma non prima!!!(sigh!)


Private Sub executeCommand(ByVal dataSource As String, _
ByVal sqlString As String)
Dim myList As New Hashtable
Dim re As New Regex("(?<=@)(?<name>\w+)")
Dim m As Match
Dim g As Group
For Each m In re.Matches(sqlString)
myList.Add(m.Groups("name").Value, m.Groups("name").Value)
Next
Ado.ExecuteCommand("db2lin", sqlString, Me, myList)
End Sub

Quella che tu vedi è il metodo che istanzia la classe Ado che ho postato precedentemente.
La classe che contiene questo metodo viene ereditata dalla classe di una tabella qualsiasi.
(In questo esempio la tabella si chiama Aziende ed ha 2 proprietà: Codazi e Desazi).
Lo scopo di questa funzione è che, data una determinata stringa sql, esempio: "INSERT INTO Aziende VALUES(@Codazi,@Desazi)", esamina il testo, estrae i campi delle proprietà, carica l'array e lo passa alla classe Ado.
Quello che non riesco è trasformare m.Groups("name").value in proprietà della classe in modo da recuperarne il valore.
I nomi che sono presenti nella array sono i nomi in formato testo che invece dovrebbero essere proprietà. Infatti, Codazi e Desazi sono proprietà della classe.
Ci vorrebbe un Ctype (esiste?) che trasforma m.Groups("name").Value in proprietà.
Nel caso sopra dovrebbe essere Aziende.Codazi, Aziende.Desazi
Non si potrebbe per caso usare la reflection?
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5