尝试在C#中构造泛型类型会因MissingMethodException而失败

时间:2012-08-28 02:03:03

标签: c# .net generics asp.net-mvc-4

我有以下类定义:

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;
}

并且_dbC_c的类型属于DbContextContextGenericRepository在其构造函数中需要的类型 - 是的,我从.GetType().FullName得到了这些。有什么想法吗?

1 个答案:

答案 0 :(得分:4)

您的构造函数声明了三个参数。但是你对Activator.CreateInstance的调用只传递了两个参数 - 它没有传入最后一个参数的值(它拥有一个默认值 - string[] includes = null):

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

CreateInstance要求指定所有参数 - 它将方法 - 重载解析算法基于您传递的参数,并且不考虑默认参数的可能性。因此,要修复,只需将null(默认值)作为最后一个参数传递:

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