パラメータに渡されるジェネリック型に基づいてこの式を動的にするにはどうすればよいですか?簡略化した形でジェネリック型に基づいて動的述語を構築する
:
public static class CompareService
{
public static List<T> Run<T>(List<T> database_list, string directory_path)
{
var csv_list = CompareService.MergeRecordsFromFiles<T>(directory);
return CompareService.RunComparison<T>(database_list, csv_list);
}
public static T CompareData<T>(List<T> database_list, List<T> csv_list)
{
var diff = new List<T>();
foreach (var db_item in database_list)
{
// ...
// if T is of type Deathstar compare reference_number property
// if T is of type Stormtrooper compare id property
// if T is of type Sith compare id and anger_level property
var csv_item = csv_list.FirstOrDefault(x => x.reference_number == db_item.reference_number);
// Comparison code
ComparisonResult result = compareLogic.Compare(db_item, csv_item);
// ...
}
return diff;
}
}
別の汎用サービスから呼び出される:最も単純な実装では、あなたのitemToFind
がDeathStar
にキャストできるかどうかを確認することです
public static void Whatever<T>(List<T> list)
{
// ...
var directory_path = "C:\";
var delta = CompareService.CompareData<T>(list, directory_path);
// ...
}
メソッドの命名は正確ではありません。おそらくあなたはそれを 'GetByReferenceNumber()'またはそれに類するものと呼ぶつもりでしたか?また、これは 'Where()'節を 'FirstOrDefault()'で直接置き換えることができることを意味します。 – silkfire
あなたはタイプミスがありますか? 'list'パラメータは関数の本体で' database_list'ですか? –
また、ユースケースについてさらに詳しく説明する必要があると思います。 –