【问题标题】:Extension method for generic interface does not show on subclasses通用接口的扩展方法不显示在子类上
【发布时间】:2011-03-11 17:58:08
【问题描述】:

我正在尝试实现一种扩展方法来为我的 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 上。

更新

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

【问题讨论】:

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


    【解决方案1】:

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

    试试这个

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

    【讨论】:

      【解决方案2】:

      我让它像新的一样工作 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();
      

      【讨论】:

      • 这就是我之前使用它的方式,我只是想我可以将它作为扩展方法使用。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多