泛型类中的隐式类型参数

时间:2015-01-23 07:54:09

标签: c# generics

鉴于我的ViewModel具有强类型参数 当我使用NavigationService时,接受页面类型作为参数, 然后,当不正确类型的参数传递给NavigateMethod时,我不会编译器抛出错误。

到目前为止,我写过以下内容:

interface IPageViewModel<TParameter>    

void Navigate<TViewModel, TParameter>(TParameter argument) 
            where TViewModel : IPageViewModel<TParameter>;

class PageWithStringParameter : IPageViewModel<string>

为什么这不起作用?

navigationService.Navigate<PageWithStringParameter>("some string");

如果我将PageWithStringParameter作为TViewModel参数传递,则TParameter必须是string类型,因为它实现了IPageViewModel。 传递TParameter类型参数是多余的。

有什么办法,如何避免写这个:

navigationService.Navigate<PageWithStringParameter, string>("some string");

编译器错误非常混乱,特别是如果我还有NavigateMethod的无参数重载

2 个答案:

答案 0 :(得分:2)

方法Navigate有两个通用的两个类型参数。你只提供一个。无法部分指定类型参数。您可以指定所有这些,也可以不指定(在这种情况下都应该隐式解析)

答案 1 :(得分:2)

您可以考虑的接口方法是让Navigate不带参数返回一个操作对象,如下所示:

public class Operations<TViewModel>
{
    void To<TParameter>(TParameter argument);
}

Operations<TViewModel> Navigate<TViewModel>();

所以你可以这样调用这个操作:

navigationService.Navigate<PageWithStringParameter>().To("some string");

不幸的是,您无法使用“where”子句限制类型,但您可以使用代码执行此操作。