C# 泛型类中的隐式类型参数
假设我有带有强类型参数的ViewModels 我使用NavigationService,它接受页面类型作为参数, 将不正确类型的参数传递给Navigate方法时。 然后我希望编译器抛出一个错误 到目前为止,我已经写了以下内容:C# 泛型类中的隐式类型参数,c#,generics,C#,Generics,假设我有带有强类型参数的ViewModels 我使用NavigationService,它接受页面类型作为参数, 将不正确类型的参数传递给Navigate方法时。 然后我希望编译器抛出一个错误 到目前为止,我已经写了以下内容: interface IPageViewModel<TParameter> void Navigate<TViewModel, TParameter>(TParameter argument) where TVie
interface IPageViewModel<TParameter>
void Navigate<TViewModel, TParameter>(TParameter argument)
where TViewModel : IPageViewModel<TParameter>;
class PageWithStringParameter : IPageViewModel<string>
界面IPageViewModel
无效导航(TParameter参数)
其中TViewModel:IPageViewModel;
类PageWithStringParameter:IPageViewModel
为什么这不起作用
navigationService.Navigate<PageWithStringParameter>("some string");
navigationService.Navigate(“某些字符串”);
如果我将PageWithStringParameter作为TViewModel参数传递,TParameter必须是string类型,因为它实现了IPageViewModel。
传递TParameter类型参数是多余的
有没有办法,如何避免写这样的话:
navigationService.Navigate<PageWithStringParameter, string>("some string");
navigationService.Navigate(“某些字符串”);
编译器错误非常令人困惑,特别是如果我还有NavigateMethod的无参数重载方法
Navigate
有两个通用的两种类型参数。您只提供了一个。不能部分指定类型参数。您可以指定它们中的任何一个,或者它们中没有一个(所有都应该在这种情况下隐式解析) 您可以考虑的一种接口方法是在没有参数的情况下进行导航,返回如下的操作对象:
public class Operations<TViewModel>
{
void To<TParameter>(TParameter argument);
}
Operations<TViewModel> Navigate<TViewModel>();
公共类操作
{
无效至(t参数参数参数);
}
操作导航();
因此,您可以这样调用该操作:
navigationService.Navigate<PageWithStringParameter>().To("some string");
navigationService.Navigate().To(“某个字符串”);
不幸的是,您失去了使用“where”子句限制类型的能力,但您可以使用代码来实现这一点。当您实际上只需要一个参数时,为什么要创建具有两个参数的泛型方法?因为我希望这会导致编译器错误:navigationService.Navigate(123);但是我想要这个:navigationService.Navigate(“一些字符串”);导航到PageWithStringParameter的Instance并传递“某些字符串”argument@Liero
Navigate(123)
为您提供编译时间error@Sergey:我知道:)同时指定参数的类型对我来说似乎是多余的,因为它可以从PageWithStringParameter插入。如前所述,可以指定所有类型参数,也可以不指定任何类型参数。可能无法简化我的导航方法。此代码根本不限制参数类型。你不想去哪里吗?