使用反射来调用泛型方法

时间:2018-06-06 03:44:20

标签: c# xamarin reflection

我的代码中有一个字符串变量,我需要用它来调用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>

1 个答案:

答案 0 :(得分:1)

有多个PushPageModel方法。其中一个采用一个通用参数,另一个采用两个。我建议你使用GetDeclaredMethods()(带有s)并迭代结果。