93 messaggi dal 22 marzo 2012
Buongiorno lista
ho creato una struct

public struct Prova
{
public string Code;
public string Description;
}

ho bisogno, per trasformarla in un datatable e quindi mi serve prima di tutto leggere la struttura dei campi (tipo e nome) della struttura per creare una struttura nel datatable (scusa il ripetere della parola struttura :) ).
Non trovo da nessuna parte un qualcosa che mi dia lo spunto per realizzare quanto sopra e a questo punto non so nemmeno se si possa fare.
Attendo fiducioso una risposta positiva/negativa in quanto sono due giorni che mi sto spaccando la testa sullo spigolo di acciaio della porta.
Grazie ancora
Cordiali saluti a tutti

Perini Luca

Perini Luca
11.886 messaggi dal 09 febbraio 2002
Contributi

Buongiorno lista

Buongiorno a te, sottoscrittore Luca.


mi serve prima di tutto leggere la struttura dei campi (tipo e nome)

Si può assolutamente fare usando la Reflection API, di cui puoi trovare un'introduzione qui:
https://docs.microsoft.com/it-it/dotnet/csharp/programming-guide/concepts/reflection

In sintesi, la Reflection API è un insieme di classi e metodi che ti permettono di esaminare la struttura interna di un tipo come il tuo struct Prova. Puoi conoscere quali membri contiene e il loro tipo (ma non solo).
In questa discussione trovi un esempio di funzione chiamato CreateDataTable che ti permette appunto di generare un DataTable conforme ad un tipo arbitrario.
https://stackoverflow.com/questions/18746064/using-reflection-to-create-a-datatable-from-a-class/24131656

Inoltre, dato che la funzione CreateDataTable accetta un IEnumerable come parametro, provvederà a riversare i valori di tutti gli oggetti trovati nell'elenco in altrettante righe del DataTable.
Ecco un esempio di come usare la funzione:
//Prima mi creo una lista di oggetti Prova
var lista = new List<Prova> {
  new Prova { Code = "A", Description = "AAA" },
  new Prova { Code = "B", Description = "BBB" },
  new Prova { Code = "C", Description = "CCC" }
};
//E poi li riverso in un DataTable che ha struttura conforme all'oggetto Prova.
//dt avrà due colonne (Code e Description) e tre righe (gli oggetti con codice A, B e C)
DataTable dt = CreateDataTable<Prova>(lista);


Però, affinché la funzione CreateDataTable<T> funzioni nel tuo caso, dovrai modificare i campi Code e Description in modo che siano delle proprietà. Cioè, riscrivi così la struct.
public struct Prova
{
  public string Code {get; set;}
  public string Description {get; set;}
}


Se non ti è possibile fare questa modifica dimmelo che poi ti dico come modificare la funzione CreateDataTable affinché funzioni con i campi anziché con le proprietà.

Gloria alla lista!
Moreno

Enjoy learning and just keep making
93 messaggi dal 22 marzo 2012
Grazie Moreno

la funzione CreateTable l'avevo già trova ma non mi funzionava e non capivo il perché.
Ho effettuato la modifica alla structure che mi ha consigliato e adesso funziona.
Ti chiedo quando avrai tempo di indicarmi la modifica di cui fai riferimento alla funzione CreateTable per le structure che non hanno il get e set in modo da poter modificare la funzione (che per inciso ho inserito in una DLL che sto costruendo per riutilizzarla su più progetti) in modo che possa funzionare in entrambe le situazioni e sia il programmatore a scegliere.
Ringraziandoti ancora per l'aiuto datomi ti invio cordiali saluti e un buon lavoro.

Ciao

Luca Perini

Perini Luca
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao Luca,


Ti chiedo quando avrai tempo di indicarmi la modifica di cui fai riferimento alla funzione CreateTable per le structure che non hanno il get e set


A grandi linee, bisogna modificare le occorrenze della parola "property" con "field". Infatti, se non metti {get; set;}, il membro è un field e non una proprietà.

La funzione CreateDataTable<T> quindi diventerà così:
  public static DataTable CreateDataTable<T>(IEnumerable<T> list)
  {
    Type type = typeof (T);
    var fields = type.GetFields();
    DataTable dataTable = new DataTable();
    foreach (var info in fields)
    {
      dataTable.Columns.Add(new DataColumn(info.Name, Nullable.GetUnderlyingType(info.FieldType) ?? info.FieldType));
    }

    foreach (T entity in list)
    {
      object[] values = new object[fields.Length];
      for (int i = 0; i < fields.Length; i++)
      {
        values[i] = fields[i].GetValue(entity);
      }

      dataTable.Rows.Add(values);
    }

    return dataTable;
  }


La puoi vedere in azione in questo fiddle.
https://dotnetfiddle.net/SKcE4h

ciao,
Moreno

Enjoy learning and just keep making
93 messaggi dal 22 marzo 2012
Grazie di tutto Moreno

Perini Luca

Perini Luca

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.