作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我不确定这是否只是我没有使用正确的语法,或者我是否遗漏了一个概念。
所以基本的设计是这样的:
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 项目中使用它的 Controller 添加一些继承。
所以我想做的是
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 接口(interface)来表示我可以假设 controller.GetList(1, 10)
会返回一个 ListModelBase,然后我可以随后假设返回的模型在列表部分的每个项目上都有一个 Id。
这可能吗?还是有更好的方法来做我想做的事?
更新:
明确地说,我知道我可以在 Controller 级别定义多个类型,但这不是我想要的。
所以我知道我可以做到:
public interface IListController<T, TItemModel>
where T : ListModelBase<TListModel>
where TItemModel : ListItemModelBase
{
T GetList(int Page, int ItemsPerPage);
}
最佳答案
放宽对 IListController 的约束并执行类似的操作(如果可以使用较小的类型,如 List<T>
,请不要在接口(interface)上公开 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);
}
关于c# - 继承具有不同泛型参数的泛型接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21994145/
我是一名优秀的程序员,十分优秀!