gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 18:30:05 25 4
gpt4 key购买 nike

我不确定这是否只是我没有使用正确的语法,或者我是否遗漏了一个概念。

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

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com