2

私は次のクラス定義を持っています:

public abstract class ControllerBase<T, V> : Controller where T : EntityBase<T> where V : GenericRepository<T>

その後、クラスの後半で次のコードを使用します。

private V _repo;
...
_repo = (V)Activator.CreateInstance(typeof(V), _dbC, _c);

これは問題なくコンパイルされます。次に、次の定義を持つクラスがあります。

public class SecurityRoleController : ControllerBase<SecurityRole, GenericRepository<SecurityRole>>

それもうまくコンパイルされます。ただし、ブラウザで/ SecurityRoleを押しようとすると、例外が発生しConstructor on type GenericRepository'1 not foundます。(これは実際には例外のバックティックですが、SOフォーマットが壊れることに注意してください。)これはGenericRepository<T>、クラスのインスタンスを直接作成しようとすると正常に機能するパブリックコンストラクターがあるにもかかわらずです。

クラスの汎用インスタンスを適切に構築する方法を知っている人はいますか?

TIA、
ベンジー

編集:

のコンストラクタGenericRepository

public GenericRepository(DbContext dbContext, Context c, string[] includes = null)
{
    _dbContext = dbContext;
    _c = c;
    if (includes != null)
    {
        _includes = includes;
    }
    return;
}

そして、andの型は_dbCand_cDbContextあり、コンストラクターでrequiresが必要とContextする型です。そうです、私はこれらをから取得しました。何かご意見は?GenericRepository.GetType().FullName

4

1 に答える 1

4

コンストラクターは 3 つのパラメーターを宣言します。ただし、への呼び出しActivator.CreateInstanceは2つの引数のみを渡しています-最後のパラメーターの値を渡していません(デフォルト値を持っています-- string[] includes = null):

_repo = (V)Activator.CreateInstance(typeof(V), _dbC, _c);

CreateInstanceすべてのパラメーターを指定する必要があります。メソッドのオーバーロード解決アルゴリズムは、渡す引数に基づいており、デフォルトのパラメーターの可能性は考慮されていません。したがって、修正するにはnull、最後の引数として (デフォルト値) を渡すだけです。

_repo = (V)Activator.CreateInstance(typeof(V), _dbC, _c, null);
于 2012-08-29T02:04:20.903 に答える