1

我正在为我的 MVC 4 项目构建(尝试构建)通用存储库、任务和控制器,并使用它来学习泛型和接口。我已经走了很远,但坚持这个错误。CustomerContactsListViewModel 确实继承自 IViewModelList,这就是我感到困惑的原因。

错误:

The type 'OTIS.AppServ.OrderMgmt.ViewModels.CustomerContactsListViewModel' cannot be used as type parameter 'TViewModelList' in the generic type or method 'OTIS.AppServ.BaseAppServGrid<TRepository,TViewModelSingle,TViewModelList>'. There is no implicit reference conversion from 'OTIS.AppServ.OrderMgmt.ViewModels.CustomerContactsListViewModel' to 'OTIS.AppServ.IViewModelList<OTIS.domain.OrderMgmt.Customer,OTIS.AppServ.OrderMgmt.ViewModels.CustomerContactsListViewModel>'.

界面:

public interface IViewModelList<TClass, TViewModelList>
    {
        IEnumerable<TClass> ConvertViewModelToClass(IEnumerable<TViewModelList> entityList);
        IEnumerable<TViewModelList> ConvertClassToViewModel(IEnumerable<TClass> entityList);
    }

继承接口的视图模型:

    public class CustomerContactsListViewModel : IViewModelList<CustomerContact, CustomerContactsListViewModel>, IEntity

被继承的通用任务(应用程序服务)类:

public class BaseAppServGrid<TRepository, TViewModelSingle, TViewModelList> : BaseAppServ<TRepository, TViewModelSingle>
            where TRepository : class, IEntity, IAuditStamps, new()
            where TViewModelSingle : class, IViewModelSingle<TRepository, TViewModelSingle>, new()
            where TViewModelList : class, IEntity, IViewModelList<TRepository, TViewModelList>, new()

尝试继承 Base 的特定 Task/App 服务类会引发错误:

public class ManageCustomersAppServ : BaseAppServGrid<Customer, CustomerViewModel, CustomerContactsListViewModel>
4

1 回答 1

2

CustomerContactsListViewModel您已经实现了IViewModelList类型的第一个参数CustomerContact

但是,该类ManageCustomersAppServ已使用 type 声明Customer

所以

IViewModelList<Customer, CustomerContactsListViewModel>

不可分配给

IViewModelList<CustomerContact, CustomerContactsListViewModel>

您需要:

  1. Change BaseAppServGrid to take another generic parameter like so:

    public class BaseAppServGrid<TModel, TRepository, TViewModelSingle, TViewModelList> :
        BaseAppServ<TRepository, TViewModelSingle>
        where TRepository : class, IEntity, IAuditStamps, new()
        where TViewModelSingle : class, IViewModelSingle<TRepository, TViewModelSingle>, new()
        where TViewModelList : class, IEntity, IViewModelList<TModel, TViewModelList>, new()
    
    public class ManageCustomersAppServ : BaseAppServGrid<CustomerContact, Customer, CustomerViewModel, CustomerContactsListViewModel>
    
  2. Review whether Customer and CustomerContact can derive from some IRepository interface/class, if that was your intention when you passed Customer to a generic param called "TRepository".

于 2013-01-02T01:16:58.577 回答