我正在处理一系列不同的CSV文件,希望编写一个通用的读写器,只需传递必要的类型即可。RegisterClassMap()通常需要您定义的映射器。第一个示例是不使用泛型的工作代码。
public static IEnumerable<CacheEntryRequest> ReadCacheRequestFile(string filename)
{
List<CacheEntryRequest> requests;
using (var sr = new StreamReader(filename))
{
var csv = new CsvReader(sr);
csv.Configuration.RegisterClassMap<CacheEntryRequestMapper>();
requests = csv.GetRecords<CacheEntryRequest>().ToList();
}
return requests;
}
以下是我尝试写一个通用方法,使用Mapper类型的通用参数,但失败了:
public static IEnumerable<TR> Read<TR, TMap>(string filename)
{
List<TR> records;
using (var sr = new StreamReader(filename))
{
var csv = new CsvReader(sr);
csv.Configuration.RegisterClassMap<TMap>();
records = csv.GetRecords<TR>().ToList();
}
return records;
}
接下来,RegisterClassMap会抱怨:
类型“TMap”无法用作泛型类型或方法“CsvConfiguration.RegisterClassMap()”中的类型参数“TMap”。从“TMap”到“CsvHelper.Configuration.CsvClassMap”没有装箱、拆箱转换或类型参数转换。
期望的用法是:
var records = CsvFile.Read<CacheEntryRequest, CacheEntryRequestMapper>(filename);
RegisterClassMap
有一个泛型约束,只允许它与CsvClassMap
或其派生类一起使用,但是你的Read
方法没有在TMap
上放置类似的约束。 - Pieter Witvoet