转换两个方法以传递"T"用于通用的使用

本文关键字:quot 用于 两个 方法 转换 | 更新日期: 2023-09-27 18:13:45

我正在编写一个程序,其中有以下两个方法。显然,当你看到它们时,它们非常重复,所以我希望将它们重构为一个名为IEnumerable <dynamic> GetRecords(csv,?,?)的方法。我遇到麻烦的地方是理解当我创建方法时,我需要做些什么来传递参数,这些参数允许我将T替换为RegisterMapClass,然后将T替换为GetRecords。

       private static IEnumerable<LeadRecord> GetLeadRecords()
    {
        using (TextReader textLeadReader = File.OpenText("Leads.csv"))
        {
            var csvLeads = new CsvReader(textLeadReader);
            csvLeads.Configuration.RegisterClassMap<LeadRecordMap>();
            return  csvLeads.GetRecords<LeadRecord>().ToList();
        }
    }
    private static IEnumerable<AccountRecord> GetAccountRecords()
    {
        using (TextReader txtAccountsReader = File.OpenText("Accounts.csv"))
        {
            var csvAccounts = new CsvReader(txtAccountsReader);
            csvAccounts.Configuration.RegisterClassMap<AccountRecordMap>();
            return csvAccounts.GetRecords<AccountRecord>().ToList();
        }
    }

转换两个方法以传递"T"用于通用的使用

像这样?

private static IEnumerable<T> GetAccountRecords<T,T2>(string filename) 
{
    using (TextReader txtAccountsReader = File.OpenText(filename))
    {
        var csvAccounts = new CsvReader(txtAccountsReader);
        csvAccounts.Configuration.RegisterClassMap<T2>();
        return csvAccounts.GetRecords<T>();
    }
}

您可以为此重构您的两个方法

private static IEnumerable<T> GetRecords<T, TMap>(string filename)
{
    using (TextReader reader = File.OpenText(filename))
    {
        using(var csvReader = new CsvReader(reader)) 
        {
            csvReader.Configuration.RegisterClassMap<TMap>();
            return csvReader.GetRecords<T>().ToList();
        }
    }
}

你可以这样调用这个方法:

var records = GetRecords<LeadRecord, LeadRecordMap>("file.csv");

只是为了扩展接受的答案,应该编译以下内容:

    private static IEnumerable<T> GetRecords<T, TMap>(string filename)
        where T : class
        where TMap : ClassMap<T>
    {
        using (TextReader reader = File.OpenText(filename))
        {
            using (var csvReader = new CsvReader(reader))
            {
                csvReader.Configuration.RegisterClassMap<TMap>();
                return csvReader.GetRecords<T>();
            }
        }
    }