泛型接口的扩展方法不显示在子类上

时间:2011-02-28 00:59:04

标签: c# asp.net-mvc-3 moq generics

我正在尝试实现一个扩展方法来初始化我的MVC3应用程序的Moq存储库。我有一个存储库界面:

public interface IRepository<TEntity> : IDisposable where TEntity : class
{
    //Methods
}

我有几个类,例如UserRepository,它实现了这个接口:

public interface IUserRepository : IRepository<User>
{
   //Specific methods for User repository
}

public class UserRepository : EfRepositoryBase<User>, IUserRepository
{
}

EfRepositoryBase是我的存储库基类,为我的存储库提供了通用方法。在我的单元测试中,我想为每种类型的存储库创建一个扩展方法来检索模拟存储库。我尝试添加这样的扩展方法:

public static class RepositoryHelpers
{
    public static Mock<IRepository<T>> GetMockRepository<T>(this IRepository<T> repository, params T[] items) where T : class
    {
        Mock<IRepository<T>> mock = new Mock<IRepository<T>>();
        mock.Setup(m => m.GetAll()).Returns(items.AsQueryable());
        return mock;
    }
}

然而,这似乎不起作用。我期望使用UserRepository.GetMockRepository(...)来检索初始化的模拟存储库,但该方法不会显示在UserRepository上。

更新

我让它像新的UserRepository()一样工作.GetMockRepository(),有没有办法让这个方法作为静态方法可用,所以我不需要新建一个UserRepository?

2 个答案:

答案 0 :(得分:2)

扩展方法用于对象的实例,而不是为类型添加静态方法。

试试这个

(new UserRepository()).GetMockRepository(...)

答案 1 :(得分:0)

  

我让它像新的一样工作   UserRepository()。GetMockRepository()   有没有办法制作这种方法   可以作为静态方法使用,所以我不这样做   必须新建一个UserRepository吗?

这个怎么样......

public static class RepositoryHelpers<T> where T : class
{
    public static Mock<IRepository<T>> GetMockRepository<T>(params T[] items) 
    {
        Mock<IRepository<T>> mock = new Mock<IRepository<T>>();
        mock.Setup(m => m.GetAll()).Returns(items.AsQueryable());
        return mock;
    }
}

用法:

var repositoryMock = RepositoryHelpers<User>.GetMockRepository();