2016-12-12 5 views
1

私は同様の質問トンで見てきましたが、それらのどれも私が同じことを試みているようです。クラスインスタンスではなく、クラスへの参照が必要です。クラスの型または文字列からクラスの参照を取得

ジェネリック型関数のクラス参照を動的に作成しようとしています。次のように私の機能は次のとおりです。ここで

private void CleanupTable<T, U>(DbSet<T> dbSet, CleanupModel.Tables table, DbSet<U> lastDbSet, dynamic removedRec) where T : class where U : class 
{ 
    ParameterExpression tpe = Expression.Parameter(typeof(T)); 
    Expression idProp = Expression.Property(tpe, typeof(T).GetProperty(GetIdProperty(lastDbSet))); 
    Expression constIdProp = Expression.Constant(removedRec.GetType().GetProperty(GetIdProperty(lastDbSet)).GetValue(removedRec, null), typeof(int)); 
    Expression completeExpression = Expression.Equal(idProp, constIdProp); 

    Expression<Func<T, bool>> expression = Expression.Lambda<Func<T, bool>>(completeExpression, tpe); 
    List<T> removedRecs = dbSet.Where(expression).ToList(); 

    removedRecs.ForEach(rec => 
    { 
     DbSet nextSet = GetNextSet(dbSet); 

     //Here is where I'm trying to create a reference using nextSet 
     CleanupTable</*nextSetType reference*/, T>(nextSet, GetNextTable(dbSet), dbSet, rec); 

     dbSet.Remove(rec); 
     reportHelper.ReportSuccess(table, ReportHelper.ReportReasons.Linked, rec); 
    }); 
} 

GetNextSet()のコードです:

private DbSet GetNextSet(CleanupModel.Tables table) 
{ 
    switch (table) 
    { 
     case CleanupModel.Tables.Version: return context.Page; 
     //More cases 
     default: return null; 
    } 
} 

私はGetType()のようなものを使用して試してみましたが、ジェネリックがTypeを受け付けません。私がしようとしていることは可能なのでしょうか?

+2

あなたは[MakeGenericMethod]使用することができます(https://でMSDN .microsoft.com/ja-us/library/system.reflection.methodinfo.makegenericmethod(v = vs.110).aspx)。最後の例を確認してください –

+0

私はそれが私が必要なことをしているのか分かりません。あるいは、私はそれを十分に理解していないかもしれません。あなたは詳しく説明できますか? –

+0

タイプ推論が機能しないのはなぜですか? 'GetNextSet'の署名は何ですか? 'nextSet'のタイプは何ですか? – InBetween

答えて

0

SOLUTION

だから私はそれを挟んの助けのおかげで解決しました。私はCleanupTable()が引数から型を推測させてしまった。もともと問題は、タイプが汎用タイプDbSetであり、暗黙的にタイプされていなかったため、タイプを推論できないということでした。私は関連する値をダイナミクスに設定して、実行時にCleanupTable()を把握するだけで、この問題を解決しました。ここで

が更新されたコードです:

CleanupTable()

private void CleanupTable<T, U>(DbSet<T> dbSet, CleanupModel.Tables table, DbSet<U> lastDbSet, dynamic removedRec) where T : class where U : class 
{ 
    ParameterExpression tpe = Expression.Parameter(typeof(T)); 
    Expression idProp = Expression.Property(tpe, typeof(T).GetProperty(GetIdProperty(lastDbSet))); 
    Expression constIdProp = Expression.Constant(removedRec.GetType().GetProperty(GetIdProperty(lastDbSet)).GetValue(removedRec, null), typeof(int)); 
    Expression completeExpression = Expression.Equal(idProp, constIdProp); 

    Expression<Func<T, bool>> expression = Expression.Lambda<Func<T, bool>>(completeExpression, tpe); 
    List<T> removedRecs = dbSet.Where(expression).ToList(); 

    removedRecs.ForEach(rec => 
    { 
     dynamic nextSet = GetNextSet(table); 
     if (nextSet == null) 

     CleanupTable(nextSet, GetNextTable(table), dbSet, rec); 

     dbSet.Remove(rec); 
     reportHelper.ReportSuccess(table, ReportHelper.ReportReasons.Linked, rec); 
    }); 
} 

GetNextSet()

private dynamic GetNextSet(CleanupModel.Tables table) 
{ 
    switch (table) 
    { 
     case CleanupModel.Tables.Version: return context.Page; 
     //More cases 

     default: return null; 
    } 
} 
関連する問題