Search code examples
csvhelper

Where does CSVHelper determine the Type Converter to use for a property?


I'm trying to understand how CsvHelper sets the TypeConverter for a property in a given MemberMap.

Given this code:

public MyMapper : ClassMap<Client>
{
    public MyMapper()
    {
       Map(c => c.Age).Name("C_AGE");
       ...
    }
 }

I'm not specifying the Type Converter to use so somewhere along the line, CsvHelper has to be looking at the Age property of Client and determining that it is an int and that it should convert the CSV value to an int using the Int32Converter. Where is it making this determination?

I've browsed the code some on GitHub but haven't been able to locate where this takes place.


Solution

  • The short answer to your question is that the defaults for each type are created in TypeConverterCache.

    private void CreateDefaultConverters()
    {
        AddConverter(typeof(bool), new BooleanConverter());
        AddConverter(typeof(byte), new ByteConverter());
        AddConverter(typeof(byte[]), new ByteArrayConverter());
        AddConverter(typeof(char), new CharConverter());
        AddConverter(typeof(DateTime), new DateTimeConverter());
        AddConverter(typeof(DateTimeOffset), new DateTimeOffsetConverter());
        AddConverter(typeof(decimal), new DecimalConverter());
        AddConverter(typeof(double), new DoubleConverter());
        AddConverter(typeof(float), new SingleConverter());
        AddConverter(typeof(Guid), new GuidConverter());
        AddConverter(typeof(short), new Int16Converter());
        AddConverter(typeof(int), new Int32Converter());
        AddConverter(typeof(long), new Int64Converter());
        AddConverter(typeof(sbyte), new SByteConverter());
        AddConverter(typeof(string), new StringConverter());
        AddConverter(typeof(TimeSpan), new TimeSpanConverter());
        AddConverter(typeof(ushort), new UInt16Converter());
        AddConverter(typeof(uint), new UInt32Converter());
        AddConverter(typeof(ulong), new UInt64Converter());
        AddConverter(typeof(IList), new IEnumerableConverter());
        AddConverter(typeof(ICollection), new IEnumerableConverter());
        AddConverter(typeof(IEnumerable), new IEnumerableConverter());
        AddConverter(typeof(IDictionary), new IDictionaryConverter());
    }