使用不同的泛型参数继承通用接口

时间:2014-02-24 17:04:02

标签: c# generics inheritance interface

我不确定这是不是我没有使用正确的语法,或者如果我错过了一个概念。

所以基本的设计是这样的:

public abstract class ListItemModelBase
{
    Guid id { get; set; }
}

public abstract class ListModelBase<T> where T : ListItemModelBase
{
    List<T> Items { get; set; }
}

public class OrderListModel : ListModelBase<OrderListItemModel>
{
}

这一切都运行正常,但现在我想为我的MVC项目中使用它的控制器添加一些继承。

所以我想做的是

public interface IListController<T> where T : ListModelBase<ListItemModelBase>
{
    T GetList(int Page, int ItemsPerPage);
}

然后我可以做:

public class OrderListController : IListController<OrderListModel>, BaseController
{
    public OrderListModel GetList(int Page, int ItemsPerPage)
    {

    }
}

但显然这是不可能的,因为ListModelBase需要应用泛型类型。

这里的目标是使我能够使用IListController接口来表示我可以假设controller.GetList(1, 10)将返回一个ListModelBase,然后我可以假设返回的模型将具有一个Id在列表部分的每个项目上。

这可能吗?或者有更好的方式做我想做的事吗?

更新:

要清楚,我知道我可以在控制器级别定义多种类型,但这不是我想要的。

所以我知道我可以这样做:

public interface IListController<T, TItemModel> 
      where T : ListModelBase<TListModel>
      where TItemModel : ListItemModelBase
{
    T GetList(int Page, int ItemsPerPage);
}

1 个答案:

答案 0 :(得分:0)

松开IListController上的约束并执行类似的操作(如果您可以使用较小的类型(例如List<T>)进行应用,则不要在接口上公开IEnumerable

public abstract class ListItemModelBase
{
    public Guid Id { get; set; }
}

public class ListItem : ListItemModelBase
{
}

public abstract class ListModelBase<T> where T : ListItemModelBase
{
    public IEnumerable<T> Items { get; set; }
}

public class OrderListModel : ListModelBase<ListItem>
{
}

public interface IListController<T>
{
    T GetList(int page, int itemsPerPage);
}

public abstract class BaseController
{
}

public class OrderListController : BaseController, IListController<OrderListModel>
{
    public OrderListModel GetList(int page, int itemsPerPage)
    {
        return new OrderListModel();
    }
}

然后你可以做类似的事情:

var controller = new OrderListController();
var orderListModel = controller.GetList(0, 10);
foreach (var kindOfA in orderListModel.Items)
{
    doSomeThing(kindOfA.Id);
}