2013-08-21 27 views
5

Sto scrivendo un metodo per generare un DataTable che prende come origine dati un IEnumerable generico. Sto cercando di impostare un valore predefinito sul campo se non c'è nessun valore, con il codice qui sotto:Perché il codice non viene compilato?

private void createTable<T>(IEnumerable<T> MyCollection, DataTable tabela) 
     { 
      Type tipo = typeof(T); 

      foreach (var item in tipo.GetFields()) 
      { 
       tabela.Columns.Add(new DataColumn(item.Name, item.FieldType)); 
      } 

      foreach (Pessoa recordOnEnumerable in ListaPessoa.listaPessoas) 
      { 
       DataRow linha = tabela.NewRow(); 

       foreach (FieldInfo itemField in tipo.GetFields()) 
       { 
        Type typeAux = itemField.GetType(); 

        linha[itemField.Name] = 
         itemField.GetValue(recordOnEnumerable) ?? default(typeAux); 

       } 
      } 
     } 

E 'gettando questo errore:

The type or namespace name 'typeAux', could not be found (are you missing a using directive or an assembly reference?)

Perché? La funzione "Predefinito (Tipo)" non dovrebbe restituire un valore predefinito per quel tipo?

+3

'default()' richiede un tipo di nome, non un 'di riferimento Type'. Ad esempio, 'default (int)'. – recursive

risposta

0

L'istruzione default non funziona con System.Type.

Detto, sembra più appropriato lasciare che fuori, e utilizzare DBNull direttamente:

linha[itemField.Name] = itemField.GetValue(recordOnEnumerable) ?? DBNull.Value; 

Se il valore è null, fissando il risultato di null (che, in un DataRow, è DBNull.Value) sembra appropriato

+0

ma richiede che i tipi come int, boolean ecc siano dichiarati come Nullables? ... –

+0

@WilnerAvila No - 'itemField.GetValue' restituisce null solo se il valore era effettivamente nullo. Non potrebbe mai accadere con int, bool, ecc. –

Problemi correlati