Пример #1
0
        /// <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;
            }
        }