转换两个方法以传递"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();
}
}
像这样?
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>();
}
}
}