Drew Marsh が言ったように、ジェネリック Type 引数の名前だけでジェネリック メソッドを呼び出す方法はありません。そのため、実行時のメソッド解決を使用したちょっとしたごみの解決策であると判断する可能性のあるものしか提案できません-それは機能しますが...
まず、 内に動的変数を割り当て、foreach
(eg) という名前のプライベート メソッドを呼び出しますCallGenerateLog()
。
foreach (ObjectStateEntry entry in
context.ObjectStateManager.GetObjectStateEntries(
EntityState.Added | EntityState.Modified))
{
dynamic dynamicEntity = entry.Entity;
CallGenerateLog(dynamicEntity);
}
...CallGenerateLog()
ログに記録するエンティティの種類ごとに のオーバーロードを 1 つ提供し、それぞれにメソッドを呼び出させますGenerateLog()
。たとえば、次のようになります。
private static void CallGenerateLog(User user)
{
GenerateLog(user);
}
private static void CallGenerateLog(Customer customer)
{
GenerateLog(customer);
}
...など...そして、コンパイラを満足させ、明示的なオーバーロードを持たないエンティティ型が見つかった場合に呼び出されるキャッチオールオーバーロードを提供します。
private static void CallGenerateLog(object entity)
{
}
これには次のような問題があります。
CallGenerateLog()
エンティティ タイプごとに のオーバーロードが必要なため、ログに記録する新しいエンティティ タイプを追加する場合は、そのエンティティ タイプにオーバーロードを追加することを忘れないでください (T4 テンプレートでこれに対処することはできますが)。
実行時のメソッド解決にはいくらかのオーバーヘッドがあるため、メソッドのパフォーマンスをプロファイルし、問題が発生するかどうかを判断する必要がある場合があります。