c#xxx是一个变量但是像一个类型一样使用

时间:2016-06-02 09:36:17

标签: c# xamarin.forms

我在我的xamarin表单应用程序中有一个模型,用于生成动态导航菜单

 public class NavigationMenuItem
 {
        public string MenuText { get; set; }
        public string MenuIcon { get; set; }
        public Type TargetType { get; set; }
 }

 NavigationMenuItems.Add(new NavigationMenuItem
 {
        MenuText = "Settings",
        MenuIcon = "settings.png"
        TargetType = typeof(SettingsViewModel)
 });

我有一些代码允许我通过页面的视图模型导航到页面,这样视图模型就不会直接引用页面,而是通过其视图模型。当我对视图模型进行硬编码时,这是有效的:

await _navigator.PushAsync<PageViewModel>();

但如果我尝试

 var vm = selectedItem.TargetType;
 await _navigator.PushAsync<vm>();

我收到错误“vm是一个变量但是像类型一样使用”

如何将TargetType中的类型传递给PushAsync

提前致谢

JAS

2 个答案:

答案 0 :(得分:1)

PushAsync期望一个类型在编译时告诉它需要调用哪个方法。

如果您在运行时之前都不知道,那么您需要将视图模型作为参数传递:

await _navigator.PushAsync(vm);

或在视图模型上实现导航:

await vm.PushAsync();

答案 1 :(得分:0)

您不能将Type的实例作为泛型类型参数传递给该方法。但你可以用反射来实现这个目标:

var vm = selectedItem.TargetType;

MethodInfo mi = _navigator.GetType().GetMethod("PushAsync`1");
MethodInfo genericMethod = mi.MakeGenericMethod(vm);
await (Task)genericMethod.Invoke(_navigator);

因此,您可以检索通用方法定义的MethodInfo,并通过向MethodInfo提供类型来创建特定的MakeGenericMethod
最后,您可以调用该方法并将返回的对象强制转换为您可以等待的Task