On a member of a CsvRecordAttribute type, reads the member with an ICsvConverter<T>. On an assembly ([assembly: CsvConverter(typeof(MoneyConverter))]), reads with it every member of the type it converts. On a class or struct, makes a hand-written CsvRecordMapper<T> the mapper of the type, which the source generator registers so that CsvReader.GetRecords finds it.
The source generator creates the converter with new and calls it directly, so no reflection is involved and converters work with trimming and native AOT.
On a member, the converter type implements ICsvConverter<T> for the member's type (or, for a Nullable<T> member, for its underlying type, and an empty field reads as null) and has a public or internal parameterless constructor. Each mapper creates one instance, which the workers of CsvReader.ParallelEnumerate<T>(int) share, so a converter must be thread-safe.
On an assembly, the converter applies to every member, in the record types of that assembly, whose type is one that it implements ICsvConverter<T> for (or a Nullable<T> of it), built-in types included, so [assembly: CsvConverter(typeof(UkDateConverter))] reads every DateTime member with it. A member's own CsvConverterAttribute, CsvFormatAttribute, CsvBooleanValuesAttribute or CsvCultureAttribute takes precedence. The generated code is the same as with the attribute on each member, so it costs nothing per field. Two converters of the assembly cannot convert the same type.
On a type, the converter type derives from CsvRecordMapper<T> of that type and has a public or internal constructor that takes a CsvReader, or a CsvReader and the column prefix (a string, passed to the base constructor) for use as a nested record with CsvColumnAttribute.Prefix. The type does not need to be partial and must not have CsvRecordAttribute.