具有泛型接口的泛型方法

本文关键字:泛型方法 泛型接口 | 更新日期: 2023-09-27 18:10:03

我正在尝试创建一个泛型方法,其中类型是泛型接口。

private void ShowView<T>(string viewName) where T : IView<Screen>
{ 
    IRegion mainRegion = _regionManager.Regions[RegionNames.MainRegion];
    T view = (T)mainRegion.GetView(viewName);
    if (view == null)
    {
        view = _container.Resolve<T>();
        mainRegion.Add(view, viewName);
    }
    mainRegion.Activate(view);
    view.LoadData();
    view.ViewModel.IsActive = true;
}

接口为IView<T> where T : Screen

所以我有ConcreteView : IView<ConcreteViewModel>ConcreteViewModel : Screen,其中Screen是基类。当我尝试做ShowView<ConcreteView>("concrete");时,我得到一个未知方法错误。

是否因为ConcreteView使用ConcreteViewModel而不是Screen为它的IView实现?是否有一种方法重写的方法,使其工作?

具有泛型接口的泛型方法

如果不提供接口的变化,IView<ConcreteViewModel>就不是IView<Screen>

interface IView<out T>
{
}

(以上可以从c# 4.0开始完成)

否则,您应该能够像下面

那样编写您的方法签名
void ShowView<T, U>(string viewName) where T : IView<U> where U : Screen
{
     // code
}

并像ShowView<ConcreteView, ConcreteViewModel>("blah");

那样调用它