抽象接口

时间:2012-05-29 23:57:36

标签: generics interface abstract

在我的MVC3应用程序中,我试图创建一个通用类(下面名为DdlGet)来调用获取下拉列表(DDL)的记录。下面的代码按预期执行,但我认为我正在使用通用类型T - 特别是下面指出的行与'// * *'

我的控制器中有以下代码

private readonly IGeneralReferenceRepository<StatusType> statusTypeRepository;
...
public StatusController() : this(...new StatusTypeRepository()) {}

public StatusController(...IGeneralReferenceRepository<StatusType> statusTypeRepository)
{
    ...
    this.statusTypeRepository = statusTypeRepository;
}
...
public ViewResult Index()
{
    ...
    //**** The line below passes a variable (statusTypeRepository) of the Generic
    //**** type (StatusType) and additionally calls the class (Helper<StatusType>)
    //**** with the Generic
    indexViewModel.StatusTypes = Helper<StatusType>.DdlGet(statusTypeRepository);

然后在我的存储库中(这定义了从数据库[通过实体框架方法]获取DDL记录的实现) - 请注意通用引用Generic interface(IGeneralReferenceRepository)

public class StatusTypeRepository : IStatusTypeRepository, IGeneralReferenceRepository<StatusType>
{
    ...
    public IQueryable<StatusType> All
    {
        get { return context.StatusTypes; }
    }

我有一个界面(对应于上面调用的All方法)

public interface IGeneralReferenceRepository<T>
{
    IQueryable<T> All { get; }
}

一个帮助类,用于获取下拉列表记录并放入SelectList

public class Helper<T>
{
   public static SelectList DdlGet(IGeneralReferenceRepository<T> generalReferenceRepository)
   {
       return new SelectList(generalReferenceRepository.All, ...);
   }
}

我遇到的问题是上面第一个代码块中指示的行 - 即调用填充SelectList的最终实现

indexViewModel.StatusTypes = Helper<StatusType>.DdlGet(statusTypeRepository); 

正如上面在注释中所解释的那样(前缀为// * *),这会传递一个Generic statusTypeRepository,它通过以下行定义类型: -

private readonly IGeneralReferenceRepository<StatusType> statusTypeRepository;

但是我已经在Helper Generic类中定义了类型(即Helper类)

我的问题是我可以从另一个派生出一个而不是在调用中指定两次泛型。即我可以从Helper类类型派生statusTypeRepository中指定的类型,反之亦然

非常感谢 特拉维斯

1 个答案:

答案 0 :(得分:1)

不是在Helper类上使用类型参数,而是可以将它放在这样的方法中:

public class Helper
{
    public static SelectList DdlGet<T>(IGeneralReferenceRepository<T> generalReferenceRepository)
    {
        return new SelectList(generalReferenceRepository.All, ...);
    }
}

然后你可以做

indexViewModel.StatusTypes = Helper.DdlGet(statusTypeRepository); 

并且编译器将处理类型推断。