为什么这段代码没有编译?

时间:2013-08-21 00:23:56

标签: c# .net generics types

我正在编写一个生成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); 

                }
            }
        }

它抛出了这个错误:

  

找不到类型或命名空间名称'typeAux'(您是否缺少using指令或程序集引用?)

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

2 个答案:

答案 0 :(得分:1)

如何为引用类型返回null,为值类型返回Activator.CreateInstance

public static object GetDefault(Type type)
{
   if(type.IsValueType)
   {
      return Activator.CreateInstance(type);
   }
   return null;
}

参考:Programmatic equivalent of default(Type)

答案 1 :(得分:0)

default语句不适用于System.Type

话虽这么说,似乎更合适的做法,并直接使用DBNull

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

如果值为null,则将结果设置为nullDataRow中的DBNull.Value)似乎是合适的。