具有通用接口的通用方法

发布于 2024-12-07 13:32:40 字数 834 浏览 0 评论 0原文

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

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:屏幕

所以我有 ConcreteView : IViewConcreteViewModel : Screen 其中 Screen 是基类。当我尝试执行 ShowView("concrete"); 时,出现 UnknownMethod 错误。

是因为 ConcreteView 使用 ConcreteViewModel 而不是 Screen 来实现 IView 吗?有没有办法重写该方法使其有效?

I'm trying to create a generic method where the type is a generic interface.

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;
}

Interface is IView<T> where T : Screen.

So I have ConcreteView : IView<ConcreteViewModel> and ConcreteViewModel : Screen where Screen is the base class. When I try to do ShowView<ConcreteView>("concrete"); I get an UnknownMethod error.

Is it because ConcreteView uses ConcreteViewModel instead of Screen for it's IView implementation? Is there a way to rewrite the method so that it works?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

篱下浅笙歌 2024-12-14 13:32:40

IView 不是一个 IView 而不为界面提供变化

interface IView<out T>
{
}

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

否则,您应该能够编写您的方法签名如下所示

void ShowView<T, U>(string viewName) where T : IView<U> where U : Screen
{
     // code
}

并像 ShowView("blah"); 那样调用它

IView<ConcreteViewModel> is not an IView<Screen> without providing variance to the interface

interface IView<out T>
{
}

(The above can be done starting in C# 4.0)

Otherwise, you should be able to write your method signature like below

void ShowView<T, U>(string viewName) where T : IView<U> where U : Screen
{
     // code
}

And invoke it like ShowView<ConcreteView, ConcreteViewModel>("blah");

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文