【问题标题】:Class cannot be used as type parameter in the generic type or method, there is no implicit reference conversion类不能用作泛型类型或方法中的类型参数,没有隐式引用转换
【发布时间】:2013-01-01 23:06:10
【问题描述】:

我正在为我的 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>

【问题讨论】:

    标签: asp.net-mvc generics inheritance


    【解决方案1】:

    CustomerContactsListViewModel 中,您已将IViewModelList 的第一个参数实现为CustomerContact 类型。

    但是,ManageCustomersAppServ 类已声明为 Customer 类型。

    所以

    IViewModelList<Customer, CustomerContactsListViewModel>
    

    不能分配给

    IViewModelList<CustomerContact, CustomerContactsListViewModel>
    

    您需要:

    1. 更改BaseAppServGrid 以采用另一个通用参数,如下所示:

      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. 查看 Customer CustomerContact 是否可以从某个 IRepository 接口/类派生,如果这是您将 Customer 传递给名为“TRepository”的通用参数时的意图。

    【讨论】:

    • 谢谢弗兰克!有了所有这些泛型层,事情就变得棘手了!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-12
    • 2018-09-22
    相关资源
    最近更新 更多