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

継承される Generic Task (Application Services) クラス:

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の最初のパラメータを実装しました。IViewModelListCustomerContact

ただし、クラス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を「TRepository」と呼ばれる一般的なパラメータに渡したときに意図していた場合は、 CustomerCustomerContactがIRepositoryインターフェイス/クラスから派生できるかどうかを確認します。

于 2013-01-02T01:16:58.577 に答える