通用方法与通用接口

3
我正在尝试创建一个通用方法,其中类型是通用接口。
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实现吗?有没有一种重写该方法使其正常工作的方法?

1个回答

7

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");


这是因为每个通用接口都被视为不同的接口。自从.NET4.0协变成为可能,所以您可以使用out语句。 - oberfreak
好的。我之前尝试过没有指定 <T, U>,但一直出错。谢谢...这就是我缺少的东西。 - devGirl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接