c# - 继承具有不同泛型参数的泛型接口(interface)

标签 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 项目中使用它的 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/

相关文章:

PHP:类型检查返回值是一种弥补 PHP 泛型不足的好习惯吗?

c++ - 在 C++ 中使用通用接口(interface)实现比较

c# - 我可以/应该在客户端和 Web API 之间共享模型类吗?

c# - 弹出UAC消息时屏幕颜色默认为正常(无法检测到)

c# - 使用 sql 连接的最佳/标准方法是什么?

grails - 为什么这种通用用法在 groovy 中不起作用?

c# - Task<IList<>> 作为 Func<> 的结果

java - 类中几个方法的强制签名

c# - 如何在 Linq 上获得左连接

c# - 在声明时初始化 tabpage 数组