2013-08-21 215 views
5

我正在写一个方法来生成一个DataTable作为一个通用的IEnumerable数据源。我想设置在球场上,如果世界上没有价值的默认值,用下面的代码:为什么不编译这段代码?

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); 

       } 
      } 
     } 

它抛出这个错误:

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

为什么?函数“Default(Type)”不应该返回该类型的默认值吗?

+3

'默认()'需要命名类型,而不是一个'Type'参考。例如,'default(int)'。 – recursive

回答

0

default声明不适用于System.Type

话虽这么说,似乎更适合离开了这一点,并直接使用DBNull

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

如果值为null,结果设置为null(其中,在DataRow,是DBNull.Value)似乎是合适的

+0

但这样做是否要求像int,boolean等类型声明为Nullables?...... –

+0

@WilnerAvila否 - 如果该值实际上为null,则'itemField.GetValue'只会返回null。永远不会发生int,bool等 –