C#4.0泛型和ASP.net MVC

C#4.0泛型和ASP.net MVC,c#,model-view-controller,generics,covariance,contravariance,C#,Model View Controller,Generics,Covariance,Contravariance,在C#4.0中,方差说明符似乎只适用于接口类型 假设我有ViewModel/EditModel类和一个简单的模型层次结构 class MyEditModel<T> where T : Base { ... } class Derived1 : Base { ... } class Derived2 : Base { ... } 类MyEditModel,其中T:Base{…} 类Derived1:基{…} 类Derived2:基{…} 我有一个局部视图,它接受任何类型的MyEdi

在C#4.0中,方差说明符似乎只适用于接口类型

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

class MyEditModel<T> where T : Base { ... }
class Derived1 : Base { ... }
class Derived2 : Base { ... }
类MyEditModel,其中T:Base{…}
类Derived1:基{…}
类Derived2:基{…}
我有一个局部视图,它接受任何类型的MyEditModel(只要它是从Base派生的),另一个视图只接受Derived1的实例。现在,如何在同一页上呈现这两个对象


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

您唯一能做的是,如果您的视图接受基本的视图模型。从OO的角度来看,MyEditModel和Derived1共享Base作为公共基类,但它们不共享任何其他内容,没有其他关系。因此,如果您试图使用相同的,那么它必须从Base派生。据推测,基底上的属性是它们唯一的共同点

编辑: 我误解了原来的问题。根据你问题的文字,我以为你通过了Derived1,但根据你下面的评论,你通过了
MyEditModel
。这将满足您的需求:

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

使用dynamic的intellisense并不能带来好处,但可以为您的类型重用相同的视图文件,并且不必为了让编译器满意而创建额外的视图模型类。

唯一可以做到的是,如果您的视图接受Base的视图模型。从OO的角度来看,MyEditModel and Derived1将Base作为公共基类共享-但它们不共享任何其他内容-没有其他关系。因此,如果您试图使用相同的关系,则它必须从Base派生。想必,Base上的属性是它们唯一的公共属性

编辑: 我误解了原始问题。根据你问题的文字,我认为你通过了Derived1,但根据你下面的评论,你通过了
MyEditModel
。这将满足你的要求:

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

使用动态的intellisense并不能带来好处,但可以为您的类型重用相同的视图文件,并且不必创建额外的视图模型类来满足编译器的需要。

Umh,您的问题是什么?请编辑。嗯,你的问题是什么?请编辑。问题是您将MyEditModel或MyEditModel传递给接受MyEditModel的对象。这只适用于接口。就目前而言,我的lame解决方案涉及使用EditModels复制层次结构。。。Derived1编辑模型,Derived2编辑模型。。。(显然,这些不是真实的类名…我有PageEditModel:ContentItemEditModel和MediaFileEditModel:ContentItemEditModel。还会有更多。@MapDot-我对你的问题理解得太过直白,但你的最后一条评论有助于澄清它-我编辑了我的答案并验证了这一点。我保留了我蹩脚的解决方案,因为我想要IntelliSense,即使在e在我的代码中有一些冗余的代价。不过,谢谢。问题是你将MyEditModel或MyEditModel传递给接受MyEditModel的对象。这仅在接口中才可能。目前,我的蹩脚解决方案涉及使用EditModels复制层次结构…Derived1EditModel,Derived2EditModel。。。(显然,这些不是真实的类名…我有PageEditModel:ContentItemEditModel和MediaFileEditModel:ContentItemEditModel。还会有更多。@MapDot-我对你的问题理解得太过直白,但你的最后一条评论有助于澄清它-我编辑了我的答案并验证了这一点。我保留了我蹩脚的解决方案,因为我想要IntelliSense,即使在e我的代码中有一些冗余的费用。不过谢谢。