Используйте рефлексию для вызова универсального метода - PullRequest
0 голосов
/ 06 июня 2018

В моем коде есть строковая переменная, и мне нужно использовать ее для вызова универсального метода в проекте формы 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 

********. StateManager.PausedFunctionPageModel.NavigateToFunction ()[0x00020] в /*****/Functions/StateManager/PausedFunctionPageModel.cs:55 at ******. Functions.StateManager.PausedFunctionPageModel.set_SelectedFunction (*******. Common.Models.PageState value) [0x00022] в /********/Functions/StateManager/PausedFunctionPageModel.cs:29 at (управляемая оболочка) в System.Reflection.MonoMethod.InternalInvoke (System.Reflection.MonoMethod, object, object[], System.Exception &) в System.Reflection.MonoMethod.Invoke (System.Object obj, System.Reflection.BindingFlags invokeAttr, привязка System.Reflection.Binder, параметры System.Object [], культура System.Globalization.CultureInfo) [0x00032] в: 0}

1 Ответ

0 голосов
/ 06 июня 2018

Существует более одного метода PushPageModel.Один из них принимает один общий параметр, другой - два.Я предлагаю вам использовать GetDeclaredMethods () (с символом) и перебирать результаты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...