Вызов метода на статическом классе, учитывая его имя типа и имена методов как строки

Я делаю это в нескольких своих приложениях. Прием к добавлению панели вкладок к navigationController базировался, приложение не должно использовать TabBarController. Добавьте Панель вкладок к представлению, сделайте контроллер представления для того представления TabBarDelegate и ответьте на пользовательские выборы на панели вкладок в коде контроллера представления.

я использую Панели вкладок, чтобы добавить дополнительные представления к представлению Панели вкладок как подпредставления, перезагрузить табличное представление с различными наборами данных, перезагрузить UIPickerView, и т.д.

25
задан ryansin 9 May 2018 в 17:44
поделиться

5 ответов

Just

Type.GetType(typeName).GetMethod(methodName).Invoke(null, arguments);

, где typeName - имя типа в виде строки, methodName - это имя метода в виде строки, а arguments - это массив объектов, содержащих аргументы для вызова метода.

42
ответ дан 28 November 2019 в 20:45
поделиться

Сначала вам нужно получить Тип (путем итерации сборки с использованием отражения)

подробности см. по этой ссылке: http://msdn.microsoft.com/en-us/library/system.reflection.propertyinfo.aspx

или используйте

Assembly.GetType

, когда у вас есть тип в руке, вы можете перебирать элементы, используя отражение или

MethodInfo method = typeof(MyClass).GetMethod("MyMethod");

, тогда вы можете использовать MethodInfo.Invoke и передавать аргументы для вызова метода, когда вы хотите его вызвать.

4
ответ дан 28 November 2019 в 20:45
поделиться

То, что вы здесь делаете, отражает тип с именем Environment и использует методы GetPropery и GetGetMethod для получения get метода Environment.CurrentDirectory , например:

var getMethod = typeof(Environment).GetProperty("CurentDirectory", BindingFlags.Public | BindingFlags.Static).GetGetMethod();
var currentDirectory = (string)getMethod.Invoke(null, null);

Вызов метода get свойства возвращает его значение и эквивалентно:

var value = Environment.CurrentDirectory;
2
ответ дан 28 November 2019 в 20:45
поделиться

Вот базовый план того, что вы должны сделать:

  1. Просканировать все объекты в текущем домене приложений - найти тот, который соответствует имени класса, которое вы знаете
  2. Получить статический метод с известным вам именем для этого объекта
  3. Динамически вызывать его.

Изменить: Это будет работать, если вы не знаете пространство имен статического класса. В противном случае используйте решение Даниэля Брюкнера, поскольку оно намного проще.

1
ответ дан 28 November 2019 в 20:45
поделиться
System.Reflection.Assembly info = typeof(System.Environment).Assembly;

Type t = info.GetType("System.Environment");
MethodInfo m = t.GetMethod("GetFolderPath");

object result = m.Invoke(null, arguments);
3
ответ дан 28 November 2019 в 20:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: