# Migrating from version 22 to 23

## CsvConfiguration

All the constructor parameters were removed in favor of using property setters. Apply this change to any of the options.

    // v22
    var config = new CsvConfiguration(CultureInfo.InvariantCulture, delimiter = ";");

    // v23
    var config = new CsvConfiguration(CultureInfo.InvariantCulture)
    {
    	Delimiter = ";",
    };

## Delegates

All delegates now take in a single struct argument.

BadDataFound

    // v22
    var config = new CsvConfiguration(CultureInfo.InvariantCulture)
    {
    	BadDataFound = (field, context) =>
    	{
    		Console.WriteLine($"field: {field}");
    		Console.WriteLine($"context: {context}");
    	},
    };

    // v23
    var config = new CsvConfiguration(CultureInfo.InvariantCulture)
    {
    	BadDataFound = args =>
    	{
    		Console.WriteLine($"field: {args.Field}");
    		Console.WriteLine($"context: {args.Context}");
    	},
    };

ConvertFromString

    // v22
    Map(m => m.Property).Convert(row => row.GetField(0));

    // v23
    Map(m => m.Property).Convert(args => args.Row.GetField(0));

ConvertToString

    // v22
    Map(m => m.Property).Convert(value => value.ToString());

    // v23
    Map(m => m.Property).Convert(args => args.Value.ToString());

GetConstructor

    // v22
    var config = new CsvConfiguration(CultureInfo.InvariantCulture)
    {
    	GetConstructor = classType => classType.GetConstructors().First(),
    };

    // v23
    var config = new CsvConfiguration(CultureInfo.InvariantCulture)
    {
    	GetConstructor = args => args.ClassType.GetConstructors().First(),
    };

GetDynamicPropertyName

    // v22
    var config = new CsvConfiguration(CultureInfo.InvariantCulture)
    {
    	GetDynamicPropertyName = (fieldIndex, context) => $"Field{fieldIndex}";
    };

    // v23
    var config = new CsvConfiguration(CultureInfo.InvariantCulture)
    {
    	GetDynamicPropertyName = args => $"Field{args.FieldIndex}",
    };

HeaderValidated

    // v22
    var config = new CsvConfiguration(CultureInfo.InvariantCulture)
    {
    	HeaderValidated = (invalidHeaders, context) => Console.WriteLine($"Invalid headers count: {invalidHeaders.Count}"),
    };

    // v23
    var config = new CsvConfiguration(CultureInfo.InvariantCulture)
    {
    	HeaderValidated = args => Console.WriteLine($"Invalid headers count: {args.InvalidHeaders.Count}"),
    };

MissingFieldFound

    // v22
    var config = new CsvConfiguration(CultureInfo.InvariantCulture)
    {
    	MissingFieldFound = (headerNames, index, context) => Console.WriteLine($"Missing field: {headerNames[0]}"),
    };

    // v23
    var config = new CsvConfiguration(CultureInfo.InvariantCulture)
    {
    	MissingFieldFound = args => Console.WriteLine($"Missing field: {args.HeaderNames[0]}"),
    };

PrepareHeaderForMatch

    // v22
    var config = new CsvConfiguration(CultureInfo.InvariantCulture)
    {
    	PrepareHeaderForMatch = (header, fieldIndex) => header.ToLower(),
    };

    // v23
    var config = new CsvConfiguration(CultureInfo.InvariantCulture)
    {
    	PrepareHeaderForMatch = args => args.Header.ToLower(),
    };

ReadingExceptionOccurred

    // v22
    var config = new CsvConfiguration(CultureInfo.InvariantCulture)
    {
        ReadingExceptionOccurred = exception =>
        {
            Console.WriteLine(exception.Message);
            throw args.Exception;
        },
    };
    // v23
    var config = new CsvConfiguration(CultureInfo.InvariantCulture)
    {
        ReadingExceptionOccurred = args =>
        {
            Console.WriteLine(args.Exception.Message);
            throw args.Exception;
        },
    };

ReferenceHeaderPrefix

    // v22
    var config = new CsvConfiguration(CultureInfo.InvariantCulture)
    {
        ReferenceHeaderPrefix = (memberType, memberName) => $"{memberName}.",
    };

    // v23
    var config = new CsvConfiguration(CultureInfo.InvariantCulture)
    {
        ReferenceHeaderPrefix = args => $"{args.MemberName}.",
    };

ShouldQuote

    // v22
    var config = new CsvConfiguration(CultureInfo.InvariantCulture)
    {
        ShouldQuote = (field, fieldType, row) => true,
    };

    // v23
    var config = new CsvConfiguration(CultureInfo.InvariantCulture)
    {
        ShouldQuote = args => true,
    };

ShouldSkipRecord

    // v22
    var config = new CsvConfiguration(CultureInfo.InvariantCulture)
    {
        ShouldSkipRecord = (records) => record.Length == 0,
    };

    // v23
    var config = new CsvConfiguration(CultureInfo.InvariantCulture)
    {
        ShouldSkipRecord = args => args.Record.Length == 0,
    };

ShouldUseConstructorParameters

    // v22
    var config = new CsvConfiguration(CultureInfo.InvariantCulture)
    {
    	ShouldUseConstructorParameters = type => true;
    };

    // v23
    var config = new CsvConfiguration(CultureInfo.InvariantCulture)
    {
    	ShouldUseConstructorParameters = args => true;
    };

Validate

    // v22
    Map(m => m.Property).Validate(field => !string.IsNullOrEmpty(field));

    // v23
    Map(m => m.Property).Validate(args => !string.IsNullOrEmpty(args.Field));