【发布时间】:2014-02-24 17:04:01
【问题描述】:
我不确定这是否只是我没有使用正确的语法,或者我错过了一个概念。
所以基本的设计是这样的:
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);
}
【问题讨论】:
-
您发布的代码有什么问题?它对我来说编译得很好(当我添加一个扩展
ListItemModelBase的虚拟OrderListItemModel时)。包括“我想做的是……”下的那一段。我不完全清楚你在问什么。 -
@dvnrrs 控制器实现中存在错误,它认为
ListModel正好是ListModelBase<ListItemModelBase>,而不是来自ListItemModelBase的任何派生项。 -
@mhoff 很高兴看到一个例子,如果它实现了目标,不知道协方差是什么或如何使用它来获得我想要的。
-
我明白了...是covariance/contravariance 你在追求什么(
in/out关键字)?这些被例如使用。List<T>以便List<T>可转换为List<V>如果V : T。 -
@dvnrrs
List<T>不是变体。无法使用Add方法获取变体、强类型集合。
标签: c# generics inheritance interface