为什么我的视图模型不能与实现接口的通用ViewModel绑定? (ASP.NET MVC 3)

我正试图通过我的View传递以下ViewModel的实例:

public class CompanyListViewModel where T : ICompany { public IEnumerable CompanyList; public IEnumerable StateList; public CompanyListViewModel(IEnumerable list) { CompanyList = list; } } 

View采用的方式如下:

 @model Project.ViewModels.CompanyViewModels.CompanyListViewModel 

我的控制器代码将这样的内容传递给View:

 CompanyListViewModel model = new CompanyListViewModel(_companyService.FilterByCompanyState(state)); 

ICompanyInListAsUser接口实现ICompany接口的位置。 _companyService.FilterByCompanyState(state))类返回一个IEnumerable Company对象,后者又实现了ICompanyInListAsUser接口。

出于某种原因,访问我的视图时收到以下错误:

The model item passed into the dictionary is of type 'Project.ViewModels.CompanyViewModels.CompanyListViewModel`1[Project.ViewModels.CompanyViewModels.ICompanyInListAsUser]', but this dictionary requires a model item of type 'Project.ViewModels.CompanyViewModels.CompanyListViewModel`1[Project.ViewModels.CompanyViewModels.ICompany]'.

如果ICompanyInListAsUser接口确实实现了ICompany为什么我收到此错误?

任何帮助将不胜感激。

谢谢。

编辑

我还想说明我在这里想要实现的目标。 假设我的应用程序中有多个访问级别(例如用户和管理员)。 如果我的Company对象中的属性仅限管理员,该怎么办? 那么在这种情况下,我的ICompanyInListAsUser将包括我想要的所有属性作为列表中的列, 除了 admin-only属性。

因此,我的计划是将ViewModel作为基本公司接口的IEnumerable传入,并从控制器(或服务层)选择性地使用其中一个“filter”接口(如ICompanyInListAsUser的实例填充IEnumerable

希望这是有道理的,如果我需要详细说明,请告诉我。

您可以通过使用ViewModel类的接口并将Generic类型声明为Covariant来实现您要完成的任务。 像这样:

 interface ICompanyListViewModel where T : ICompany { } 

这样你也可以使用抽象类而不是公司的接口。

考虑到当您考虑这种情况时接口无法提供实现,并且您应该明白需要使用希望generics类操作的特定接口来关闭generics类型。

如果它不明显,那么,进一步考虑从纯OOP的角度来看,接口不能定义实现,只有类可以,并且C#不允许您指定重叠接口。

听起来像你正在尝试将接口视为抽象基类。