Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

CsvHelper: Writing CSV when using generics fails

C# 10 | .NET 6 | CsvHelper 29.0.0

I am attempting to use CsvHelper to write CSVs of generic types:

    public async Task RunAsync<T>()
    {
        List<T> dataList = default!;

        dataList = await ApiService.GetDataAsync<T>(Job.Read);
        
        try
        {
            string path = $"./inbox/read.{typeof(T).Name}.csv";

            CsvConfiguration config = new(System.Globalization.CultureInfo.InvariantCulture);

            using StreamWriter sw = new(path, append: false);

            using CsvWriter csvWriter = new(sw, config);

            _ = csvWriter.Context.AutoMap<T>();

            await csvWriter.WriteRecordsAsync(dataList);

        }
        catch
        {
            ...
        }
    }

For all types I try, this fails with the following error:

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

No properties are mapped for type ‘Ecms.Common.Models.HRTEMP’.
IWriter state:
Row: 2
Index: 0
HeaderRecord: 2

One of the types I am trying to write is HRTEMP:

public class HRTEMP
{
    public string? ABBRV; // Abbrv
    public DateTime? ADDDATE; // Added Date
    public string? ADDR1; // Addr 1
    public string? ADDR2; // Addr 2
    public string? ADDR3; // Addr 3
    public DateTime? ADJHIREDATE; // Adj Hire Date
    public int? AREACODE; // A/C
    public string? BUSUFFIX; // Bus Suffix
    public int? CELLPHAC; // Cell A/C
    public int? CELLPHNO; // Cell No
    public string? CITY; // City
    public string? CNTRYCODE; // Country Code
    public string? COBRASNTFLG; // COBRA Ltr Sent
    public int? COMPANYNO; // Src Com
    public int? CONTACTAC; // Contact A/C
    public string? CONTACTNAME; // Contact Name
    public int? CONTACTPHONE; // Contact Phone
    public int? COUNTYCODE; // County Code
    public int? DEPTNO; // Dept No
    public DateTime? DISABILITYDT; // Disability Date
    public int? DIVISIONNO; // Src Div
    public string? ELGBRHIRE; // Elig To Rehire
    public DateTime? ELIGSCKACCRL; // Sick Elig Date
    public int? EMPCNCID; // Emp SYTCNC Id
    public int? EMPCOMPANY; // Emp Com No
    public int? EMPDIVISION; // Emp Div No
    public int? EMPLCLASS; // Empl Cls
    public string? EMPLNAME; // Empl Name
    public int? EMPLOYEENO; // Empl No
    public string? EMPLTYPE; // Empl Type
    public DateTime? ESTAVAILDATE; // Est Avail Date
    [JsonPropertyName("EXPIREDATE")]
    public DateTime? EXPRIEDATE; // Expiration Date
    public string? FIRSTNAME25; // First Name
    public DateTime? HOLELIGDATE; // Hol Elig Date
    public int? HRTEMPID; // HRTEMP Rec Id
    public int? HRTOCCID; // 
    public DateTime? LASTDAYWK; // Last Date Wkd
    public string? LASTNAME25; // Last Name
    public DateTime? LASTYEDATE; // Last Y/E Date
    public int? LVLCODE; // LBCC Level Security
    public string? MIDDLENAME1; // Middle Name 1
    public string? MIDDLENAME2; // Middle Name 2
    public string? OCCUPDESC1; // Occupation Desc 1
    public string? OCCUPDESC2; // Occupation Desc 2
    public string? OFFICERSCODE; // Com Officer
    public DateTime? ORIGHIREDATE; // Orig Hire Date
    public int? PHONENO; // Phone No
    public int? PRTECLID; // PRTECL Rec ID
    public int? PRTLBRID; // PRTLBR Rec ID
    public int? PRTMSTID; // PRTMST Rec Id
    public int? PRTTRMID; // PRTTRM Rec ID
    public DateTime? REHIREDATE; // Re-Hire Date
    public DateTime? RETIREDDATE; // Retired Date
    public DateTime? REVIEWDATE; // Review Date
    public DateTime? SICKACRLDATE; // Sick Accrl Date
    public int? SRCCNCID; // Src SYTCNC Id
    public string? STATECODE; // St/Prov
    public string? STATUSCODE; // Record Code
    public int? SUPERVISOR1; // Supv 1 Empl
    public int? SUPERVISOR1CO; // Supv 1 Com
    public int? SUPERVISOR1DV; // Supv 1 Div
    public int? SUPERVISOR2; // Supv 2 Empl
    public int? SUPERVISOR2CO; // Supv 2 Com
    public int? SUPERVISOR2DV; // Supv 2 Div
    public int? SUP1MSTID; // Supv 1 PRTMSTID
    public int? SUP2MSTID; // Supv 2 PRTMSTID
    public int? SYTTXTID; // SYTTXT Rec Id
    public int? TERMCODE; // Term Code
    public DateTime? TERMDATE; // Term Date
    public int? TERMRSN; // Term Reason Code
    public string? UPDATEDBY; // UpDated By User
    public DateTime? UPDDATE; // Last UpDated
    public string? UPDPGM; // UpDated By Pgm
    public DateTime? VACELIGDATE; // Vac Elig Date
    public string? ZIPCODE; // Zip/Postal Code

    public HRTEMP() {}
}

If I change csvWriter.Context.AutoMap<T>() to csvWriter.Context.AutoMap<HRTEMP>(), I get the same error.

What am I doing wrong?

>Solution :

Serializers in C# often rely on properties instead of fields. The error message suggests this about your class, which has no properties:

No properties are mapped for type ‘Ecms.Common.Models.HRTEMP’.

Use properties instead of fields in your class:

public class HRTEMP
{
    public string? ABBRV { get; set; }
    public DateTime? ADDDATE { get; set; }
    // etc.
}
Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading