我不确定这是不是我没有使用正确的语法,或者如果我错过了一个概念。
所以基本的设计是这样的:
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);
}
答案 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);
}