Мое желание - запустить данную функцию по имени через AddressOf
с одним входным параметром, например, Function Foo(x as Integer) As Integer
. В рекурсивную функцию мне нужны два входа: имя функции _name As String
и объект некоторого типа t _list As t
(Integer, Double, List (Of Integer) и др. c). Цель состоит в том, чтобы обработать либо элемент, либо список элементов с именем функции, так как мне много раз приходилось обрабатывать список по заданной функции, и у меня нет sh для репликации кода обработки списка в каждом местоположении. Способы, которые я пытался назвать своими лучшими go при таком типе функции (ниже), который не обработал sh полностью, привели к этой ошибке:
Предупреждение: операция List.Test не смогли. Не удалось разрешить перегрузку, потому что Publi c 'ProcessList' не может быть вызван со следующими аргументами: 'Publi c Общая функция ProcessList (Of t) (_ fun c As Fun * c (Of Object, t), _list As System.Object) As IEnumerable (Of t) ': вывод аргумента типа завершается неудачно для параметра сопоставления аргумента' _fun c '.
Iterator Function ProcessList(Of t)(_func As Func(Of Object, t), _list As Object) As IEnumerable(Of t)
If _list.GetType = GetType(List(Of t)) Then
Yield _list.SelectMany(Function(l) ProcessList(_func, l))
Else
Yield _func(_list)
End If
End Function
Для справки я нашел фрагмент Python код, который эффективно делает то, что мне нужно, но я немного устала от перевода в этом направлении (Python на VB. net), и я не так хорошо знаком с этим типом программирования на VB. net , Фрагмент Python:
def ProcessList(_func, _list):
return map(lambda x: ProcessList(_func, x) if type(x)==list else _func(x), _list)
Любая помощь относительно того, как мне нужно вызывать эту функцию или как переработать эту функцию, если мой подход некорректен, будет принята с благодарностью!
Обновление:
Я пересмотрел, как я вызывал функцию, и несколько других вещей, основываясь на информации @ djv о том, что мой метод работает. Во-первых, из-за того, как я взаимодействую с этими функциями, я должен предоставить вышеуказанную функцию с помощью:
Public Shared Function Foo(ByVal _input As Object) As Object
Return Utilities.ProcessList(AddressOf Bar, _input)
End Function
Теперь я также получаю сообщение об ошибке:
Внимание! Ошибка операции List.Test. Невозможно привести объект типа 'System.Int32' к типу 'System.Collections.Generi c .IList`1 [System.Int32]'.
Проблема в этой точке, вероятно, связана с метод, в котором я вызываю свою функцию ProcessList, а не саму функцию, как я думал. Я взаимодействую с GUI, который не в восторге от самостоятельного вызова ProcessList, поэтому мне нужна эта промежуточная «вспомогательная» функция, которую я, очевидно, не использую правильно.