我的代码中有一个字符串变量,我需要用它来调用Xamarin表单项目中的泛型方法来进行页面导航。
我的初始代码。
string currentPage = SelectedFunction.PageName;
var abc1 = Type.GetType(currentPage);
CoreMethods.SwitchSelectedTab<abc>();
但是在做了一些研究并与一些人交谈后,我理解我们不能以这种方式初始化泛型方法,因为Type需要在编译时设置。经过一些进一步的研究,我了解到我们可以使用反射API实现这一点。我试了一下。
这是我当前的代码版本。
var currentPage = SelectedFunction.PageModelName;
var abc1 = Type.GetType(currentPage);
MethodInfo method = typeof(PageModelCoreMethods).GetTypeInfo().GetDeclaredMethod("SwitchSelectedTab");
MethodInfo generic = method.MakeGenericMethod(abc1);
generic.Invoke(new PageModelCoreMethods(CurrentPage, this), null);
代码编译正确但导航不会发生。
我正在调用的泛型方法的一些进一步信息:该方法位于nuget包中。以下是该类的github链接:https://github.com/rid00z/FreshMvvm/blob/d1c9e1896e4040388ef43203df1254787bc84f36/src/FreshMvvm/PageModelCoreMethods.cs
修改1
我按照约翰的建议审核了我的代码。而他是对的,我的逻辑绝对不正确。
这就是我想要实现的目标(静态完成时的工作)
var currentPage = SelectedFunction.PageName;
var abc1 = Type.GetType(currentPage);
CoreMethods.SwitchSelectedTab<HomeViewModel>();
CoreMethods.PushPageModel<RefreshLocationItemPageModel>();
以前,我正在尝试CoreMethods.SwitchSelectedTab();.所以我编辑了我的代码
var currentPage = SelectedFunction.PageName;
var abc1 = Type.GetType(currentPage);
CoreMethods.SwitchSelectedTab<HomeViewModel>();
MethodInfo method = typeof(PageModelCoreMethods).GetTypeInfo().GetDeclaredMethod("PushPageModel");
MethodInfo generic = method.MakeGenericMethod(abc1);
generic.Invoke(CoreMethods, null);
但是当我这样做时我得到了一个例外。
{System.Reflection.AmbiguousMatchException: Ambiguous match found.
at System.RuntimeType.GetMethodImpl (System.String name,
System.Reflection.BindingFlags bindingAttr, System.Reflection.Binder
binder, System.Reflection.CallingConventions callConv, System.Type[]
types, System.Reflection.ParameterModifier[] modifiers) [0x00059] in
<f32579baafc1404fa37ba3ec1abdc0bd>:0
at System.Type.GetMethod (System.String name,
System.Reflection.BindingFlags bindingAttr) [0x0000e] in
<f32579baafc1404fa37ba3ec1abdc0bd>:0
at System.Reflection.TypeInfo.GetDeclaredMethod (System.String name)
[0x00000] in <f32579baafc1404fa37ba3ec1abdc0bd>:0
at
********。状态管理器.PausedFunctionPageModel.NavigateToFunction()[0x00020]在/*****/Functions/StateManager/PausedFunctionPageModel.cs:55 at ******。在/ ******** / Functions / StateManager / PausedFunctionPageModel中的******。Functions.StateManager.PausedFunctionPageModel.set_SelectedFunction(*******。Common.Models.PageState value)[0x00022]的.cs:29 at(wrapper managed-to-native)System.Reflection.MonoMethod.InternalInvoke(System.Reflection.MonoMethod,object,object [],System.Exception&amp;) 在System.Reflection.MonoMethod.Invoke(System.Object obj,System.Reflection.BindingFlags invokeAttr,System.Reflection.Binder binder,System.Object [] parameters,System.Globalization.CultureInfo culture)[0x00032] in:0} < / p>