/// <summary> /// Writes the list of records to the CSV file. /// </summary> /// <param name="records">The list of records to write.</param> public virtual void WriteRecords(IEnumerable records) { Type recordType = null; try { // Write the header. If records is a List<dynamic>, the header won't be written. // This is because typeof( T ) = Object. var genericEnumerable = records.GetType().GetInterfaces().FirstOrDefault(t => t.GetTypeInfo().IsGenericType&& t.GetGenericTypeDefinition() == typeof(IEnumerable <>)); if (genericEnumerable != null) { recordType = genericEnumerable.GetGenericArguments().Single(); var isPrimitive = recordType.GetTypeInfo().IsPrimitive; if (configuration.HasHeaderRecord && !hasHeaderBeenWritten && !isPrimitive && recordType != typeof(object)) { WriteHeader(recordType); if (hasHeaderBeenWritten) { NextRecord(); } } } foreach (var record in records) { recordType = record.GetType(); var dynamicObject = record as IDynamicMetaObjectProvider; if (dynamicObject != null) { if (configuration.HasHeaderRecord && !hasHeaderBeenWritten) { WriteDynamicHeader(dynamicObject); NextRecord(); } } else { // If records is a List<dynamic>, the header hasn't been written yet. // Write the header based on the record type. var isPrimitive = recordType.GetTypeInfo().IsPrimitive; if (configuration.HasHeaderRecord && !hasHeaderBeenWritten && !isPrimitive) { WriteHeader(recordType); NextRecord(); } } try { GetWriteRecordAction(record).DynamicInvoke(record); } catch (TargetInvocationException ex) { throw ex.InnerException; } NextRecord(); } } catch (Exception ex) { var csvHelperException = ex as CsvHelperException ?? new CsvWriterException("An unexpected error occurred.", ex); ExceptionHelper.AddExceptionData(csvHelperException, Row, recordType, null, null, currentRecord.ToArray()); throw csvHelperException; } }