将类型传递给通用方法C#

时间:2018-05-18 13:04:41

标签: c# generics xamarin reflection

我有一个接受通用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);

1 个答案:

答案 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 */
}