NPoco(PetaPoco由来する.NETマイクロORM)で知られているTは、ジェネリック型のリストが与えられると、データベースに一括挿入レコードのための方法を有しています。メソッドシグネチャは次のとおりはInsertBulk <T>(IEnumerableを<T> POCOS)を呼び出す必要があるだけランタイム
void InsertBulk<T>(IEnumerable<T> pocos);
は、内部的には、型Tの名前をとり、(同様に型のプロパティ名は、列名にマップされている)に挿入するDBテーブルを決定するためにそれを使用します。 したがって、正しい型の変数がメソッドに渡されることが非常に重要です。
私の挑戦はこれです:私はIDataItemがすべて挿入可能なオブジェクトのクラスは
List<IDataItem>
として、DBに挿入するオブジェクトのリストを与えられています
- IDataItemを実装する任意の型のオブジェクト、および問題を強調するために、リスト
- に種類の混合物があるかもしれません - 私は、コンパイル時に私はInsertBulk に渡す必要があり、実際の具体的な種類を知りません
私は以下のアプローチを試みましたが、Convert.ChangeTypeの結果はObjectです。したがって、オブジェクトのリストをInsertBulkに渡していますが無効です。
private static Exception SaveDataItemsToDatabase(List<IDataItem> dtos)
{
using (var db = new DbConnection())
{
try
{
var dtosByType = dtos.GroupBy(x => x.GetType());
db.Data.BeginTransaction();
foreach (var dataType in dtosByType)
{
var type = dataType.Key;
var dtosOfType = dataType.Select(x => Convert.ChangeType(x, type));
db.Data.InsertBulk(dtosOfType);
}
db.Data.CommitTransaction();
return null;
}
catch (Exception ex)
{
db.Data.RollbackTransaction();
return ex;
}
}
}
私はこれを達成する方法はありますか?
あなたは 'dynamic'キーワードを使用してみましたが? –
dtosOfTypeを動的として宣言すると、同じ結果が得られます。BulkInsertに渡される変数はObjectのリストです。 – Laurence
Reflectionを試しましたか? 'Type.GetMethod()'を使ってメソッド定義を取得し、 'MethodInfo.Invoke()'をそれぞれの 'System.Type'sで使用しますか? – Adwaenyth