Вы можете использовать Reflection, чтобы приблизиться к желаемому результату. Если вы используете модуль для определения этой вспомогательной функции,
Public Module MyModule
Function callByName(Of T)(name As String, args As IEnumerable(Of T)) As T
Dim type = GetType(MyModule)
Dim mi = type.GetMethod(name)
Return CType(mi.Invoke(Nothing, args.Select(Function(o) DirectCast(o, Object)).ToArray()), T)
End Function
Function callByName(Of T)(instance As Object, name As String, args As IEnumerable(Of T)) As T
Dim type = instance.GetType()
Dim mi = type.GetMethod(name)
Return CType(mi.Invoke(instance, args.Select(Function(o) DirectCast(o, Object)).ToArray()), T)
End Function
End Module
Теперь здесь есть некоторые неизвестные. Я не знаю, как объявлена ваша функция MyFunction
. Каков его тип возврата? Это экземпляр экземпляра какого-то класса или это модуль? Предполагая, что он находится в том же модуле, который я поставил выше, MyModule
, поместите его туда.
Public Function MyFunction(ByRef Param1 As String, ByRef Param2 As String, ByRef Param3 As String) As String
Return Param1 & Param2 & Param3 & "Static"
End Function
Он также может быть членом экземпляра вызывающего класса. Поэтому поместите это туда
Public Function MyFunction(ByRef Param1 As String, ByRef Param2 As String, ByRef Param3 As String) As String
Return Param1 & Param2 & Param3 & "Instance"
End Function
(верно, они идентичны, за исключением того, что они возвращают)
Так что назвать их легко. Это просто так
Dim args = {"a", "b", "c"}
Dim resultStatic = callByName("MyFunction", args)
Dim resultInstance = callByName(Me, "MyFunction", args)
resultStati c = "abcStati c"
resultInstance = "abcInstance"
Видите? Вы передаете имя функции в виде строки и аргументы. Это будет работать только тогда, когда все аргументы имеют одинаковый тип, а возвращаемый тип функции одинаков. Вы также можете изменить дженерики вокруг. Но, опять же, я не знаю тип возвращаемого значения вашей функции.
Вы также можете заставить ее работать, я полагаю, Sub
. Просто поиграйте с вещами Reflection в callByName
.
Нет, нет встроенного способа вызова многопараметрической функции путем передачи одного аргумента, если только они не являются необязательными. Эй, это тоже вариант, но он потребует от вас перегрузить MyFunction
, и опять-таки это приведет к поражению цели.
Если вам не нравится использовать строку для вызова метода, вы также можете используйте NameOf
Dim resultStatic = callByName(NameOf(MyModule.MyFunction), args)
Этот ответ потребует нулевой перезаписи существующих функций. Я полагаю, это то, что вы ищете.