異なるCSVファイルのパイプラインで作業しているので、必要な型を渡すだけで一般的なリーダーとライターを作成したいと考えています。 RegisterClassMap()は、通常、定義したMapperを受け取ります。最初の例は、ジェネリックを使用しないワーキングコードです。 RegisterClassMapは文句異なる汎用パラメータを持つC#汎用戻り型
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;
}
た後:
タイプ「TMAP」を以下の何
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; }
はマッパーのタイプのための一般的なパラメータで、一般的な方法を記述するために私の失敗の試みでありますジェネリック型またはメソッド 'CsvConfiguration.RegisterClassMap()'の型パラメータ 'TMap'として使用することはできません。 "TMap"から "CsvHelper.Configuration.CsvClassMap"へのボクシングまたはアンボクシング変換または型パラメータ変換はありません。
所望の使用法は次のようになります
var records = CsvFile.Read<CacheEntryRequest, CacheEntryRequestMapper>(filename);
'RegisterClassMap'には' CsvClassMap'や派生クラスでのみ使用できるようにする一般的な制約がありますが、 'Read'メソッドは' TMap'に同様の制約を付けません。 –