<Problema>
devo instanziare un tipo da una dll via reflection. Il tipo in questione è una datatable all'interno di un typed Dataset.
Il tipo viene scelto dall'utente tra i tipi ritornati da GetTypes.
<Problema />
<Soluzione>
'Con questo faccio scegliere la DLL all'utente e carico i tipi in una treeview:
Dim dlgOpen As New OpenFileDialog
dlgOpen.ShowDialog
Dim asm As System.Reflection.Assembly
asm = System.Reflection.Assembly.LoadFrom(dlgOpen.FileName)
For Each TypeInfo as Type In asm.GetTypes
TreeView.Nodes.Add(TypeInfo.FullName)
Next
'E con questo (dovrei) istanziare il tipo scelto dall'utente per poi lavorarci
Dim tipo As Object = asm.CreateInstance(TreeView.SelectedNode.Text)
'Do Something with tipo
<Soluzione />
<Inghippo>
Mmmmhhh...c'è l'inghippo
Già nella lista di nodi restituita tutte le Datatable non hanno un fullname "pulito" come tutti gli altri tipi
invece di essere nella forma:
MyNamespace.MyTypedDataset.tbl_UtenteDataTable
compare nella forma
MyNamespace.MyTypedDataset+tbl_UtenteDataTable (ha un "+" al posto dell'ultimo punto)
<Inghippo />
<riflessione>
Anche se non capisco esattamente per cosa sta quel più, mi sveglio un attimo e capisco che probabilmente
non posso istanziare una dataTable se non istanziando il typedDataset padre.
<riflessione />
<workaround>
'Istanzio prima il Dataset che la contiene ricavando il nome dalla selezione, e poi ritorno la Datatable dalla collezione Tables
Dim nodeText As String = TreeView.SelectedNode.Text
Dim plusPosition As Integer = nodeText.IndexOf("+")
Dim nomeDataset As String = nodeText.Substring(0, plusPosition)
Dim tipoDataset As Object = asm.CreateInstance(nomeDataset)
Dim tipoDatatable As DataTable = CType(tipoDataset, DataSet).Tables(nodeText.Substring(plusPosition + 1).Replace("DataTable", ""))
<workaround />
<PS>
Ho scritto qualcosa di tecnico!
Ma allora ce la faccio!
No devo aver sbagliato da qualche parte...magari non well-formed il documento (si infatti mi manca il nodo radice!)
Vabbè non è ai livelli dei guru di ugi però è tutto mio!
<PS />