1

似乎在C#4.0中,方差说明符只适用于接口类型。C#4.0泛型和ASP.net MVC

假设我有ViewModel/EditModel类和一个简单的模型层次结构。

class MyEditModel<T> where T : Base { ... } 
class Derived1 : Base { ... } 
class Derived2 : Base { ... } 

我有接受任何类型的(只要它是从碱衍生),另一种只接受Derived1的实例的MyEditModel的局部视图。现在我该如何在同一页面上呈现两者?

接受任何MyEditModel的局部视图将在Derived1的编辑器和Derived2的编辑器之间共享。

+0

嗯,你的问题是什么?请编辑。 – 2010-10-08 03:19:00

回答

1

唯一的你可以做到这一点是如果你的观点接受基地的视图模型。从OO的角度来看,MyEditModel和Derived1共享Base作为公共基类 - 但它们不共享任何其他内容 - 没有其他关系。因此,如果您尝试使用相同的方法,那么它必须从Base派生。据推测,Base上的房产是他们唯一的共同点。

编辑: 我错误地解释了原来的问题。根据你的问题的字面文字,我认为你是通过Derived1的,但是根据你的评论通过MyEditModel<Derived1>。这将做你正在寻找什么:

Inherits="System.Web.Mvc.ViewPage<dynamic> 

你没有得到与动态智能感知的利益 - 但你得到重用了同样的观点文件为您的类型的利益而不必受益创建额外的视图模型类只是为了让编译器感到开心。

+0

问题是您将MyEditModel 或MyEditModel 传递给接受MyEditModel 的内容。这只适用于接口。 – MapDot 2010-10-08 03:40:07

+0

至于现在,我的跛脚的解决方案涉及复制层次结构与EditModels ... Derived1EditModel,Derived2EditModel,...(显然,这些不是真正的类名...我有PageEditModel:ContentItemEditModel和MediaFileEditModel:ContentItemEditModel。 – MapDot 2010-10-08 03:42:25

+0

@MapDot - 我把你的问题写得太直接了,但是你的最后一条评论有助于澄清它 - 我编辑了我的答案并验证了这一点。 – 2010-10-08 11:30:07