0

私はこの署名を持つメソッドを持っています:

public void GenerateLog<TEntity>(TEntity entity) where TEntity : EntityObject

ObjectContext をループして、ObjectContext の各エンティティに対してこれを呼び出すにはどうすればよいですか?
私はこれを行うことができることを知っています:

foreach (ObjectStateEntry entry in
                context.ObjectStateManager.GetObjectStateEntries(
                EntityState.Added | EntityState.Modified))
{
    string entityName = entry.Entity.GetType().Name;
}

GenerateLog<MYSTRING>しかし、名前の文字列表現から の代わりに移動する方法がわかりませんGenerateLog<TEntity>

4

2 に答える 2

2

からジェネリック メソッドを作成し、GenerateLogそれを呼び出す必要があります。私は通常、このようなものを機能させる前に少しいじる必要がありますが、これは近いはずです

MethodInfo generateLog = typeof(YourClass)
    .GetMethod("GenerateLog", BindingFlags.Public | BindingFlags.Instance );

MethodInfo genericGenerateLog = generateLog.MakeGenericMethod(entry.Entity.GetType());

genericGenerateLog.Invoke(this, new object[] { entry.Entity });

YourClassGenerateLog が入っているクラスです。

于 2011-05-28T00:38:22.453 に答える
-1

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)
{
}

これには次のような問題があります。

  1. CallGenerateLog()エンティティ タイプごとに のオーバーロードが必要なため、ログに記録する新しいエンティティ タイプを追加する場合は、そのエンティティ タイプにオーバーロードを追加することを忘れないでください (T4 テンプレートでこれに対処することはできますが)。

  2. 実行時のメソッド解決にはいくらかのオーバーヘッドがあるため、メソッドのパフォーマンスをプロファイルし、問題が発生するかどうかを判断する必要がある場合があります。

于 2011-05-28T00:20:27.083 に答える