docs/change-log/index.html
Attributes.IsDefined instead of Attributes.GetCustomAttributes to check for attributes on a type. This is more performant.net6.0 and net7.0 and added net9.0.Dispose and DisposeAsync to writer write async methods.UseDefaultOnConversionFailure to true when the default value is null.IDictionary<string, object> on FastDynamicObject.dynamic.RecordWriter.CreateWriteDelegate<T>(T record) to RecordWriter.CreateWriteDelegate<T>(Type type).DynamicRecordWriter.CreateWriteDelegate<T>(T record) to DynamicRecordWriter.CreateWriteDelegate<T>(Type type).ExpandoObjectRecordWriter.CreateWriteDelegate<T>(T record) to ExpandoObjectRecordWriter.CreateWriteDelegate<T>(Type type).ObjectRecordWriter.CreateWriteDelegate<T>(T record) to ObjectRecordWriter.CreateWriteDelegate<T>(Type type).PrimitiveRecordWriter.CreateWriteDelegate<T>(T record) to PrimitiveRecordWriter.CreateWriteDelegate<T>(Type type).RecordWriterFactory.MakeRecordWriter<T>(T record) to RecordWriterFactory.MakeRecordWriter<T>(RecordTypeInfo typeInfo).RecordManager.Create methods. Use Func<T> RecordManager.GetReadDelegate<T>(Type recordType) instead.RecordManager.Write methods. Use Action<T> RecordManager.GetWriteDelegate<T>(RecordTypeInfo typeInfo) instead.RecordCreator.Create methods. Use Func<T> RecordCreator.GetCreateRecordDelegate<T>(Type recordType) instead.RecordWriter.Create methods. Use Action<T> RecordWriter.GetWriteDelegate<T>(RecordTypeInfo typeInfo) instead.RecordWriterFactory.MakeRecordWriter<T>(T record) to RecordWriterFactory.MakeRecordWriter(RecordTypeInfo typeInfo).GuidConverter to throw TypeConverterException instead of FormatException to be consistent with other converters.TypeConverter<T> where T is Nullable did not work.System.Linq.Async.TypeConverter class to allow for easier creation of type converters.TypeConverter was renamed to NotSupportedTypeConverter.TypeConverter is now a generic type converter base class.static CsvConfiguration.WithAttributes method to create a new configuration with attributes applied.ShouldQuote optimizations.LineBreakInQuotedFieldIsBadData is enabled.Convert on empty Map() would throw an exception.HasHeaderRecord set to false was writing a header record.This Operation is only valid on generic types was being thrown.CsvDataReader couldn't be used if lines were read manually ahead of time.CsvDataReader wasn't working when HasHeaderRecord was false.CsvReader.ColumnCount did not match CsvParser.Count.GetDelimiter was not detecting the correct delimiter when there are blank lines.CsvWriter not passing leavOpen parameter to other constructor call.Added Field and RawRecord to BadDataException.
Pass IWriterConfiguration into CsvWriter constructor instead of CsvConfiguration.
Allow inherited header prefixes.
Allow mapping to dynamic properties.
Added MemberName to the type converter exception message.
Added MaxFieldSize configuration. If max size is set and the size is reached, MaxFieldSizeException is thrown.
Added class level attribute capability.
New Attributes:
BufferSizeAttributeCacheFieldsAttributeCommentAttributeCountBytesAttributeDelimiterAttributeDetectColumnCountChangesAttributeDetectDelimiterAttributeDetectDelimiterValueAttributeEncodingAttributeEscapeAttributeExceptionMessagesContainRawDataAttributeHasHeaderRecordAttributeIgnoreBlankLinesAttributeIgnoreReferencesAttributeIncludePrivateMembersAttributeInjectionCharactersAttributeInjectionEscapeCharacterAttributeInjectionOptionsAttributeLineBreakInQuotedFieldIsBadDataAttributeMaxFieldSizeAttributeModeAttributeNewLineAttributeProcessFieldAttributeQuoteAttributeTrimOptionsAttributeUseNewObjectForNullReferenceMembersAttributeWhiteSpaceCharsAttributeAdded params object[] constructorArgs to TypeConverterAttribute.
Added validation message expression to Validate mapping.
Added IReaderRow to ValidateArgs.
Relax Default and Constant type constraints to IsAssignableFrom.
null check in WriteRecords.string field and string rawRecord to BadDataException constructor.double MaxFieldSize { get; } to IParserConfiguration.bool LeaveOpen { get; } to IWriterConfiguration.bool LeaveOpen { get; } to IParserConfiguration.IReaderRow row to ValidateArgs constructor.Added support for TypeConverter factories. This allows for the ability to handle many types at once. Code that manually handle nullable, enums, and collections were changed into factories.
Moved delimiter detection into a configuration function. This allows for a user to easily change the detection logic. Default logic is in ConfigurationFunction.GetDelimiter.
Changed CsvConfiguration.SanitizeInjection flag to CsvConfiguration.InjectionOptions enum.
Options are:
Added \t and \r to CsvConfiguration.InjectionEscapeCharacter.
Changed CsvConfiguration.InjectionEscapeCharacter from \t to '.
CsvDataReader.GetDataTypeName will use types when the schema table is overridden.
More detail added to CsvConfiguration.Validate exception messages.
Reduce double dictionary lookup in a few places.
ConfigureAwait(false) added to async calls.CsvReader.TryGetField throwing an exception when multiple headers are read.MemberMap.Validate passing the wrong type into the expression call.MemberMap<T>.Convert not working with static methods.DateTimeConverter and DateTimeOffsetConverter throwing an exception other than TypeConverterException on failure.MissingFieldFound was not being called if IgnoreBlankLines was off.CsvConfiguration.SanitizeForInjection -> CsvConfiguration.InjectionOptionsbool IWriterConfiguration.SanitizeForInjection -> InjectionOptions IWriterConfiguration.InjectionOptionsCsvConfiguration.InjectionEscapeCharacter changed from \t to '.\t and \r to CsvConfiguration.InjectionCharacters.GetDelimiter IParserConfiguration.GetDelimiter delegate.Updated delimiter detection algorithm.
CultureInfo.TextInfo.ListSeparator if it's on every line.Cache processed fields in parser so they're not processed on every access.
Cache CsvParser.Record[] so multiple calls wont' regenerate it.
ShouldSkipRecord is null by default and won't get called if not set.
ShouldSkipRecordArgs holds IReaderRow now instead of string[].
Changed CsvParser constructor to take in IParserConfiguration instead of CsvConfiguration.
Changed CsvReader constructor to take in IReaderConfiguration instead of CsvConfiguration.
MemberMapData passed to them when converting the item.BadDataFound was being called multiple times for the same field.ShouldSkipRecordArgs holds IReaderRow now instead of string[].ConfigurationFunctions.ShouldSkipRecord as the default is now null.IParserConfiguration.Validate.DateOnly and TimeOnly types.\t wasn't removed and just an exception was being thrown.IParserConfiguration.DetectDelimiter.IParserConfiguration.DetectDelimiterValues.IWriter.WriteRecordsAsync<T>(IAsyncEnumerable<T> records, CancellationToken cancellationToken = default).\t from CsvConfiguration.WhiteSpaceChars as a default.ExceptionMessagesContainRawData that defaults to true.init properties. These were causing people too many problems.bool IParserConfiguration.ExceptionMessagesContainRawData { get; }.bool IWriterConfiguration.ExceptionMessagesContainRawData { get; }.init removed and now have constructors with parameters.
init.CancellationToken to reading and writing async methods.ShouldQuote not having the correct field type when writing records instead of fields.CharCount and ByteCount when trimming.void IWriterRow.WriteConvertedField(string field) -> void IWriterRow.WriteConvertedField(string field, Type fieldType)void CsvWriter.WriteConvertedField(string field) -> void CsvWriter.WriteConvertedField(string field, Type fieldType)init properties to set. Once VB.NET implements init, it can change back.CsvWriter.WriteBuffer protected so sub classes can write fields.CsvWriter.Flush and CsvWriter.FlushAsync will now flush the underlying TextWriter.delegate methods to accept an args struct instead of parameters. This makes it easier to understand what parameters are passed in, and allows for additional parameters to be added later without a breaking change.CsvConfiguration constructor. The properties are now settable, so this isn't needed for VB.NET.[EnumIgnoreAttribute].EnumIgnoreCase value not making it to the converter when reading.ParserMode to CsvMode and added the modes to CsvWriter.Type fieldType parameter to ShouldQuote delegate.TypeConverterOptions.EnumIgnoreCase (default is false). Allows EnumConverter to ignore case when matching enum names, values, or NameAttribute.EnumConverter when duplicate names or values appeared in an Enum.ParserMode -> CsvModeIParserConfiguration.ProcessFieldBufferSize.IWriterConfiguration.Mode.ShouldQuote(string, IWriterRow) -> ShouldQuote(string, Type, IWriterRow).EnumConverter was changed to case sensitive by default.Quote, read until a Delimiter or NewLine is found.Quote is found that isn't preceded by an Escape, read until a Delimiter or NewLine` is found.TrimOptions.Trim will be applied before these rules.init properties on CsvConfiguration by adding a constructor that takes in all properties as optional named arguments.No changes.
CsvConfiguration.NewLine not defaulting to '\r\n'.CsvWriter not keeping track of Row and Index.CsvConfiguration.NewLine changed to a string. You can now read and write any string you like for a line ending. This defaults to Environment.NewLine. When reading, if the value is not explicitly set \r\n, \r, or \n will still be used.init.Environment.NewLine.char? CsvConfiguration.NewLine changed to string CsvConfiguration.NewLine.record to eliminate threading issues.NewLine.Caches enum.ReadingContext and WritingContext were merged into a single CsvContext. Anywhere that used either was changed to CsvContext.Funcs and Actions now have their own delegate.ConvertUsing renamed to Convert.ShouldQuote now takes in IWriterRow instead of CsvContext.CsvConfiguration changed from a class to a record.CsvConfiguration properties changed to read only get; init;.CsvConfiguration.NewLine changed to char?.CsvConfiguration.NewLineString removed.CsvConfiguration.RegisterClassMap moved to CsvContext.CsvConfiguration.UnregisterClassMap moved to CsvContext.CsvConfiguration.AutoMap moved to CsvContext.IParserConfiguration setters removed.bool IParserConfiguration.CacheFields added.bool IParserConfiguration.LeaveOpen added.char? IParserConfiguration.NewLine added.ParserMode IParserConfiguration.Mode added.IParserConfiguration.IgnoreQuotes removed.char[] IParserConfiguration.WhiteSpaceChars added.IReaderConfiguration setters removed.IReaderConfiguration.TypeConverterOptionsCache removed.IReaderConfiguration.TypeConverterCache removed.IReaderConfiguration.Maps removed.IReaderConfiguration.RegisterClassMap removed.IReaderConfiguration.UnregisterClassMap removed.IReaderConfiguration.AutoMap removed.ISerializerConfiguration removed and properties added to IWriterConfiguration.IWriterConfiguration setters removed.IWriterConfiguration.QuoteString removed.IWriterConfiguration.TypeConverterCache removed.IWriterConfiguration.MemberTypes removed.IWriterConfiguration.Maps removed.IWriterConfiguration.RegisterClassMap removed.IWriterConfiguration.UnregisterClassMap removed.IWriterConfiguration.AutoMap removed.MemberMap.Optional added.MemberMap<TClass, TMember>.ConvertUsing renamed to Convert.CsvFieldReader removed.CsvParser.Read returns boolean instead of string[].CsvParser constructors that take in a FieldReader removed.CsvParser[int index] added to retrieve fields after a Read.CsvSerializer removed.IFieldReader removed.IParser.ByteCount added.IParser.CharCount added.IParser.Count added.IParser[int index] added.IParser.Record added.IParser.RawRecord added.IParser.Row added.IParser.RawRow added.IParser.Read returns bool instead of string[].IParser.ReadAsync returns bool instead of string[].IReader.Parser removed.int IReaderRow.ColumnCount added.int IReaderRow.CurrentIndex added.string[] IReaderRow.HeaderRecord added.IParser IReaderRow.Parser added.ISerializer removed.string[] IWriterRow.HeaderRecord added.int IWriterRow.Row added.int IWriterRow.Index added.RecordBuilder removed.IParameterMapper to BooleanFalseValuesAttribute, BooleanTrueValuesAttribute, ConstantAttribute, CultureInfoAttribute, DateTimeStylesAttribute, DefaultAttribute, FormatAttribute, HeaderPrefixAttribute, IgnoreAttribute, NameIndexAttribute, NullValuesAttribute, NumberStylesAttribute, OptionalAttribute, and TypeConverterAttribute.MapTypeConverterOption to MemberMapTypeConverterOptions.TypeConverterOptions.NumberStyle to TypeConverterOptions.NumberStyles.ReflectionHelper.CreateInstance<T>.ReflectionHelper.CreateInstance.ReflectionHelper.CreateInstanceWithoutContractResolver.NameAttribute added interface IParameterMapper.IndexAttribute added interface IParameterMapper.Action<bool, string[], int, ReadingContext> IReaderConfiguration.HeaderValidated -> Action<InvalidHeader[], ReadingContext> IReaderConfiguration.HeaderValidatedAction<bool, string[], int, ReadingContext> CsvConfiguration.HeaderValidated -> Action<InvalidHeader[], ReadingContext> CsvConfiguration.HeaderValidatedConfigurationFunctions.HeaderValidated signature changed from (bool isValid, string[] headerNames, int headerNameIndex, ReadingContext context) to (InvalidHeader[] invalidHeaders, ReadingContext context)CsvReader.ValidateHeader(ClassMap map) -> CsvReader.ValidateHeader(ClassMap map, List<InvalidHeader> invalidHeaders)HeaderValidationException.HeaderNames.HeaderValidationException.HeaderNameIndex.InvalidHeader[] HeaderValidationException.InvalidHeaders.[Name] attribute on enum values.Enum that will be a default for all enum types.ObjectDisposedException when CsvReader is disposed. A message hint was added to help the user understand what went wrong.Func<ReadingContext, int, string> IReaderConfiguration.GetDynamicPropertyName.Func<ReadingContext, int, string> CsvConfiguration.GetDynamicPropertyName.IgnoreAttribute to ignore the whole property treey if put on a reference property when auto mapped.CsvDataReader.FieldCount was throwing an exception if there were no records.CsvDataReader.GetOrdinal issue where it wasn't doing a case-insensitive match after a failed case-sensitive match. Run values through PrepareHeaderForMatch.null to WriteField didn't output a field.ReflectionHelper caching not always unique.DecimalConverter and DoubleConverter to match MS's recommendations.DataReader.GetValues not working when column and rows have different count.System.Threading.Tasks.Extensions to 4.5.2 due to loading error of Microsoft.Bcl.AsyncInterfaces.IMemberReferenceMapper to IgnoreAttribute.IAsyncDispose on writing classes.<PackageReference Include="System.Threading.Tasks.Extensions" Version="4.5.3" /> to net45.<PackageReference Include="System.Threading.Tasks.Extensions" Version="4.5.3" /> to net47.<PackageReference Include="System.Threading.Tasks.Extensions" Version="4.5.3" /> to netstandard2.0.IWriter added interface IAsyncDisposable for net47 and netstandard2.1.ISerializer added interface IAsyncDisposable for net47 and netstandard2.1.WritingContext added interface IAsyncDisposable for net47 and netstandard2.1.CsvWriter added methods public async ValueTask DisposeAsync() and protected virtual async ValueTask DisposeAsync(bool disposing) for net47 and netstandard.CsvSerializer added methods public async ValueTask DisposeAsync() and protected virtual async ValueTask DisposeAsync(bool disposing) for net47 and netstandard.WritingContext added methods public async ValueTask DisposeAsync() and protected virtual async ValueTask DisposeAsync(bool disposing) for net47 and netstandard.netstandard2.1 build.CRLF, CR, LF, or Environment.NewLine.Configuration to CsvConfiguration to avoid namespace conflicts.GetRecordsAsync and WriteRecordsAsync.<PackageReference Include="System.Reflection.TypeExtensions" Version="4.4.0" /> from netstandard2.0.<PackageReference Include="System.Reflection.TypeExtensions" Version="4.4.0" /> from netstandard2.1.<PackageReference Include="Microsoft.Bcl.AsyncInterfaces" Version="1.1.0" /> to net47.<PackageReference Include="Microsoft.Bcl.AsyncInterfaces" Version="1.1.0" /> to netstandard2.0.ClassMap.AutoMap() -> ClassMap.AutoMap(CultureInfo)CsvParser.CsvParser(TextReader) -> CsvParser.CsvParser(TextReader, CultureInfo)CsvParser.CsvParser(TextReader, bool) -> CsvParser.CsvParser(TextReader, CultureInfo, bool)CsvReader.CsvReader(TextReader) -> CsvReader.CsvReader(TextReader, CultureInfo)CsvReader.CsvReader(TextReader, bool) -> CsvReader.CsvReader(TextReader, CultureInfo, bool)CsvSerializer.CsvSerializer(TextWriter) -> CsvSerializer.CsvSerializer(TextWriter, CultureInfo)CsvSerializer.CsvSerializer(TextWriter, bool) -> CsvSerializer.CsvSerializer(TextWriter, CultureInfo, bool)CsvWriter.CsvWriter(TextWriter) -> CsvWriter.CsvWriter(TextWriter, CultureInfo)CsvWriter.CsvWriter(TextWriter, bool) -> CsvWriter.CsvWriter(TextWriter, CultureInfo, bool)Factory.CreateParser(TextReader) -> Factory.CreateParser(TextReader, CultureInfo)Factory.CreateReader(TextReader) -> Factory.CreateReader(TextReader, CultureInfo)Factory.CreateWriter(TextWriter) -> Factory.CreateWriter(TextWriter, CultureInfo)IFactory.CreateParser(TextReader) -> IFactory.CreateParser(TextReader, CultureInfo)IFactory.CreateReader(TextReader) -> IFactory.CreateReader(TextReader, CultureInfo)IFactory.CreateWriter(TextWriter) -> IFactory.CreateWriter(TextWriter, CultureInfo)ISerializerConfiguration.NewLine.ISerializerConfiguration.NewLineString.Configuration.NewLine.Configuration.NewLineString.Configuration.Configuration() parameterless constructor.IMemberMapper or IMemberReferenceMapper to be loaded. All existing attributes added these and implemented the interface.Configuration to CsvConfiguration.IAsyncEnumerable<T> CsvReader.GetRecordsAsync<T>()IAsyncEnumerable<T> CsvReader.GetRecordsAsync<T>(T anonymousTypeDefinition)IAsyncEnumerable<object> CsvReader.GetRecordsAsync(Type type)IAsyncEnumerable<T> CsvReader.EnumerateRecordsAsync<T>(T record)Task CsvWriter.WriteRecordsAsync(IEnumerable records)Task CsvWriter.WriteRecordsAsync<T>(IEnumerable<T> records)IAsyncEnumerable<T> IReader.GetRecordsAsync<T>()IAsyncEnumerable<T> IReader.GetRecordsAsync<T>(T anonymousTypeDefinition)IAsyncEnumerable<object> IReader.GetRecordsAsync(Type type)IAsyncEnumerable<T> IReader.EnumerateRecordsAsync<T>(T record)Task IWriter.WriteRecordsAsync(IEnumerable records)Task IWriter.WriteRecordsAsync<T>(IEnumerable<T> records)RawRecord adding spaces if TrimOptions.Trim is used.Type will throw exception by default.CsvReader.ReadAsync wasn't behaving the same as CsvReader.Read.Configuration to pass in the CultureInfo. When passing a culture in, the Delimiter will be set to CultureInfo.TextInfo.ListSeparator.IComparer<string> IWriterConfiguration.DynamicPropertySort.IComparer<string> Configuration.DynamicPropertySort.QuoteAllFields, QuoteNoFields, QuoteRequiredChars, and BuildREquiredQuoteChars in favor of ShouldQuote function.IWriterConfiguration.QuoteAllFields.IWriterConfiguration.QuoteNoFields.IWriterConfiguration.QuoteRequiredChars.IWriterConfiguration.BuildRequiredQuoteChars.Configuration.QuoteAllFields.Configuration.QuoteNoFields.Configuration.QuoteRequiredChars.Configuration.BuildRequiredQuoteChars.Func<string, WritingContext, bool> IWriterConfiguration.ShouldQuote.Func<string, WritingContext, bool> Configuration.ShouldQuote.NamedIndexCache type from Tuple<string, int> to (string, int).ValidationException is now abstract.IReaderConfiguration.ReadingExceptionOccurred type changed from Action<CsvHelperException> to Func<CsvHelperException, bool>.Configuration.ReadingExceptionOccurred type changed from Action<CsvHelperException> to Func<CsvHelperException, bool>.NamedIndexCache type from Tuple<string, int> to (string, int). This adds a dependency to System.ValueTuple on .NET 4.5.bool IParserConfiguration.LineBreakInQuotedFieldIsBadData.bool Configuration.LineBreakInQuotedFieldIsBadData.IReaderConfiguration.PrepareHeaderForMatch type from Func<string, string> to Func<string, int, string>.Configuration.PrepareHeaderForMatch type from Func<string, string> to Func<string, int, string>.char ISerializerConfiguration.Escape.char IParserConfiguration.Escape.char Configuration.Escape.WriteAsync wasn't calling SanitizeForInjection.leaveOpen parameter in CsvParser constructor was hard coded.This release contains changes from 8.3.0 and 8.2.0.
This has been unlisted in nuget because of a breaking change before it. The changes are in 9.0.0.
This has been unlisted in nuget because of a breaking change. The changes are in 9.0.0.
OptionalAttribute.IHasMapOptions : IHasOptional.MemberMapBuilder : IHasOptional.MemberMapBuilder : IHasOptionalOptions.ConfigurationFunctions.IgnoreBlankLines wasn't being checked in GetField<T>(int index, ITypeConverter converter).IsOptional mapping option.IsOptional mapping option.GetField was calling the ObjectResolver.ObjectResolver fallback causing a StackOverflowException.IReaderConfiguration.IgnoreReferences.IWriterConfiguration.IgnoreReferences.CsvWriter that allows for leaveOpen to be set.CsvWriter.Dispose able to be called multiple times.ConfigureAwait(false) to all async calls.ObjectResolver.IReadingContext and IWritingContext interfaces. ReadingContext and WritingContext are used directly now.Configuration.PrepareHeaderForMatch on header name to get property name for dynamic object.IWritingContext.TypeActions signature changed.ObjectResolver to create internal classes RecordManager, ExpressionManager, RecordCreatorFactory, and RecordHydrator, RecordWriterFactory.IObjectResolver.Resolve<T>( params object[] constructorArgs ) method.IWriter.WriteRecords<T>( IEnumerable<T> records ) method.TypeConverterException constructors signatures changed.Map<TClass>.References( expression ) back in.DefaultTypeConverterException message. The generated message wasn't being used.ReadingExceptionOccurred callback to GetRecord methods when an exception occurs.ISerializerConfiguration.Quote.ClassMap<TClass>.References( expression, constructorArs ). Use sub property mapping instead.ClassMap<TClass>.ConstructUsing( expression ). Use the ObjectResolver` instead.Configuration/IReaderConfiguration/IWriterConfiguration bool PrefixReferenceHeaders to Func<Type, string, string> ReferenceHeaderPrefix. The function takes in the member type and member name and returns the prefix.MemberReferenceMap.Prefix() method.ParameterReferenceMap.Prefix() method.Configuration/IReaderConfiguration/IWriterConfiguration ClassMap AutoMap<T>() to ClassMap<T> AutoMap<T>()TypeConverterException constructors parameter from ReadingContext to IReadingContext.DefaultTypeConverter.ConvertFromString not convertible exception.PrepareHeaderForMatch calls.IEnumerable.CsvWriter on Dispose.ShouldSkipRecord not called if the parser returns null for an end of stream.ShouldUseConstructorParameters returns false if there are no constructors.ConvertUsing or Constant are used.CsvParser.CsvSerializer.ConvertUsing implementation for writing.IEnumerable properties.ClassMapBuilder to build maps on the fly without a mapping class.IDynamicMetaObjectProvider objects. DynamicObject and ExpandoObject are the 2 most common.null fields to be written.IDictionary type converters.leaveOpen flag to constructors to not dispose of underlying TextReader and TextWriter.CsvHelperException and removed the string data.ConvertUsing by caching the named indexes.null when reading.IsHeaderCaseSensitive, IgnoreHeaderWhiteSpace, and TrimHeaders and added a config for PrepareHeaderForMatch that is a function. Both the header field name and the property name are ran through this method before matching against each other.ConstructUsing works with reference maps.ConstructUsing can use initializers.struct.GetField.WriteField.string formats for TypeConverterOptions.ReIndex and GetMaxIndex on CsvClassMap public.Flush method to the writer so NextRecord just writes a line ending. This will allow users to not write a line ending if they want.SerializableAttribute to exception classes. It was removed previously because of netstandard1.x not having it available.ByteArrayConverter.Property naming to Member since both properties and fields are used.TypeConverterFactory is now instance of Configuration instead of a static.Configuration flags to callbacks with default functionality to let the user change the functionality if they want.CsvClassMapCollection[type] choosing the wrong type when multiple types on the inheritance tree are mapped.Configuration.ShouldSkipRecord method always overrides the Configuration.SkipEmptyRecords setting.ConvertToString to get the method for ITypeConverter instead of the actual converter. This is so the overridden implementation will be used instead of a random method with the same name.ReflectionHelper.CreateInstance for the static delegate cache.IsFieldBad by marking unquoted fields with quote chars as bad only when Configuration.IgnoreQuotes is false.Constant not working with null.object ICsvReader.GetField( int index, ITypeConverter converter )object ICsvReader.GetField( string name, ITypeConverter converter )object ICsvReader.GetField( string name, int index, ITypeConverter converter )void ICsvWriter.WriteField( Type type, object field )void ICsvWriter.WriteField( Type type, object field, ITypeConverter converter )void ICsvWriter.WriteRecord( Type type, object record )ICsvReaderRow and into ICsvReader.IEnumerable<T> GetRecords<T>()IEnumerable<object> GetRecords( Type type )void ClearRecordCache<T>()void ClearRecordCache( Type type )void ClearRecordCache()CanConvertTo and CanConvertFrom from the type converters because there is no need for them.CsvHelperException and removed the string data.WriteRecord to not call NextRecord.IgnorePrivateAccessor to IncludePrivateProperties to be more clear on intention.CsvHelperException.IsHeaderCaseSensitive, IgnoreHeaderWhiteSpace, and TrimHeaders and added PrepareHeaderForMatch.DateTime and DateTimeOffset converters to not work when the string is spaces to match what all the other converters do. The .NET Framework DateTime and DateTimeOffset converters will convert a string of all spaces into MinValue, so we are diverging from that a little.ReadHeader to not set CurrentRecord to null.BadDataCallback to take in a ReadingContext instead of a string.Csv prefix from all classes except CsvReader, CsvParser, CsvWriter, and CsvSerializer.null values since there is no common standard that could be found.boolean values of yes, y, no, n since it's not a standard boolean. true, false, 1, 0 still work., instead of ListSeparator.Flush method to the writer.Property naming to Member.Configurations ThrowOnBadData, IgnoreReadingExceptions, SkipEmptyRecords, and WillThrowOnMissingField in favor of function callbacks.TypeConverterFactory to TypeConverterCacheTypeConverterOptionsFactory to TypeConverterOptionsCacheConfiguration.HeaderValidatedCallback to Configuration.HeaderValidatedConfiguration.MissingFieldFoundCallback to Configuration.MissingFieldFoundConfiguration.ReadingExceptionCallback to Configuration.ReadingExceptionOccurredConfiguration.BadDataFoundCallback to Configuration.BadDataFoundICsvParser to IParserFieldReader to CsvFieldReaderICsvReader to IReaderICsvReaderRow to IReaderRowICsvSerializer to ISerializerICsvWriter to IWriterICsvWriterRow to IWriterRowCsvClassMapCollection[type] choosing the wrong type when multiple types on the inheritance tree are mapped.TypeInfo compatibility stuff internal to not cause conflicts.CsvReader.ReadHeader so headers can be read without reading the first row.SerializableAttribute to all exceptions.ShouldSkipRecord not working on rows before header.TryGetField with named index returning wrong value.DateTimeConverter to the list of default converters.UseNewObjectForNullReferenceProperties is off.Prefix( string prefix = null)="0001"TrimFields to CsvWriter.Names property on CsvPropertyNameCollection to get raw list of property names.CsvClassMap<T> are now public to more easily allow mapping during runtime.DateTimeOffset converter.UseExcelLeadingZerosFormatForNumerics = true.