我有一个接受通用TViewModel
类的方法,如下所示:
Page GetPage<TViewModel>() where TViewModel : class, IViewModelBase;
在我的班级中,我得到了用户选择的项目类型(从导航列表中),如下所示:
var viewModel = item.TargetType;
此类型始终是继承自IViewModelBase
当我拨打下一行时,我需要能够传递viewModel
类型。我试图做
var page = Navigator.GetPage<viewModel>();
但是我收到以下错误:
viewModel是一个变量,但是像类型一样使用。
我是否可以将viewModel
类型传递给GetPage
方法?
如果不是我能看到的唯一方法是使用switch语句检查viewModel
类型名称并将正确的TViewModel
硬编码到GetPage
调用中。< / p>
例如:
switch (viewModel.Name)
{
case "TaskViewModel":
page = Navigator.GetPage<TaskViewModel>();
break;
case "TaskEditViewModel":
page = Navigator.GetPage<TaskEditViewModel>();
break;
}
我尝试了这个标记为重复的解决方案,并且该答案不适用于我的。我收到了错误
对象与目标类型不匹配
尝试的代码如下所示:
MethodInfo method = typeof(Navigator).GetMethod("GetPage");
MethodInfo generic = method.MakeGenericMethod(viewModel);
generic.Invoke(this, null);
答案 0 :(得分:0)
我知道泛型方法或类在编译时生成。在方法GetPage()作为泛型,您可以参数传递实现IViewModelBase的任何类。您只能传递viewModel like参数,您可以执行下一步:
Page GetPage<TViewModel>(TViewModel viewModel) where TViewModel : class, IViewModelBase;
然后你可以像这样使用它:
GetPage<ImplementerIViewModelBase>(viewModel);
其中viewModel的类型为ImplementerIViewModelBase。
如果需要知道viewModel的类型,可以使用返回Type实例的typeof()或GetType()方法。 见例:
var type = viewModel.GetType();
/* some action */
if(type is ImplemeterIViewModelBase)
{
/* some action */
}
您还可以定义泛型方法并为每种类型实现它:
//define
Page GetPage<TViewModel>(TViewModel viewModel) where TViewModel : class,
IViewModelBase;
//Implement
Page GetPage<ImpolementerIViewModelBase1>(ImplementerIViewModelBase1
viewModel)
{
/* some implementation */
}
Page GetPage<ImpolementerIViewModelBase2>(ImplementerIViewModelBase2
viewModel)
{
/* some implementation */
}
等