dis*_*r-5 3 c# generics csvhelper
我正在处理不同CSV文件的管道,因此想要编写通用的读写器,只需传递必要的类型.RegisterClassMap()通常采用您定义的Mapper.第一个例子是不使用泛型的工作代码.
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;
}
Run Code Online (Sandbox Code Playgroud)
接下来是我没有尝试使用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;
}
Run Code Online (Sandbox Code Playgroud)
之后RegisterClassMap抱怨:
类型'TMap'不能用作泛型类型或方法'CsvConfiguration.RegisterClassMap()'中的类型参数'TMap'.从'TMap'到'CsvHelper.Configuration.CsvClassMap'没有装箱或拆箱转换或类型参数转换.
所需的用法是:
var records = CsvFile.Read<CacheEntryRequest, CacheEntryRequestMapper>(filename);
Run Code Online (Sandbox Code Playgroud)
为了能够使用TMap,TMap需要与方法的输入类型兼容RegisterClassMap<T>.
你可以使用泛型约束来做到这一点.请参阅https://msdn.microsoft.com/en-us/library/d5x73970.aspx.
在您的情况下,您需要将方法签名更改为public static IEnumerable<TR> Read<TR, TMap>(string filename) where TMap : CsvClassMap类似的东西.
该类可能CacheEntryRequest有一个基类.那将是你的通用约束.
现在.假设您有一个映射类
public class CustomCacheEntryRequestMapper : CsvClassMap
{
...
}
Run Code Online (Sandbox Code Playgroud)
然后,您可以调用您的方法,如:
var records = CsvFile.Read<CacheEntryRequest, CustomCacheEntryRequestMapper >(filename);
Run Code Online (Sandbox Code Playgroud)