2017-01-18 21 views
2

異なる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); 
+1

'RegisterClassMap'には' CsvClassMap'や派生クラスでのみ使用できるようにする一般的な制約がありますが、 'Read'メソッドは' TMap'に同様の制約を付けません。 –

答えて

5

TMapを使用できるようにするために、RegisterClassMap<T>方法の入力タイプと互換性があることが必要であるTMap

これは一般的な制約を使用して行うことができます。 https://msdn.microsoft.com/en-us/library/d5x73970.aspxを参照してください。

場合によっては、メソッドの署名をpublic static IEnumerable<TR> Read<TR, TMap>(string filename) where TMap : CsvClassMapなどに変更する必要があります。

おそらくクラスCacheEntryRequestは基本クラスを持っています。それはあなたの一般的な制約になります。

今すぐ。

var records = CsvFile.Read<CacheEntryRequest, CustomCacheEntryRequestMapper >(filename); 
+0

どのようにコールを変更する必要がありますか? "タイプ... CacheEntryRequestMapperは、ジェネリックタイプまたはメソッド 'CsvFile.Read (文字列)'のタイプパラメータ 'TMap'として使用することはできません。... –

+0

ああ、私はあなたが上記の回答をしたと思います。 TMap(この場合はCsvClassMap)を満たすものから派生しています。呼び出し元の定義は... public sealed class CacheEntryRequestMapper:CsvClassMap

+1

正確には! –

3

が@PeterBonsが与えた答えは、複数の制約に追加するには、この

public static IEnumerable<TR> Read<TR, TMap>(string filename) 
    where TMap : OneClass 
    where TR : AnotherClass 
のように追加され、:のようにあなたが

public class CustomCacheEntryRequestMapper : CsvClassMap 
{ 
    ... 
} 

のようなマッピングクラスを持っていると仮定すると、次に、あなたのメソッドを呼び出すことができます

関連する問題