我在我的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
答案 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
。