Ответ 1
Вы также можете использовать делегат , чтобы вы могли передавать функции/подписи, имеющие определенную подпись.
У меня есть класс, который выполняет много похожих, но разных операций чтения/записи в файл excel. Все эти операции определены в отдельных функциях. Все они должны содержаться в одном длинном блоке кода (код, который проверяет и открывает файл, сохраняет, закрывает и т.д.). Каков разумный способ не дублировать этот код каждый раз? Проблема в том, что я не могу использовать только один метод, содержащий весь общий код, прежде чем я буду выполнять код, который отличается для каждого метода, потому что этот код должен содержаться во многих слоях if, try и для операторов общего кода.
Можно ли передать функцию в качестве параметра, а затем просто запустить эту функцию внутри общего кода? Или есть лучший способ справиться с этим?
Вы также можете использовать делегат , чтобы вы могли передавать функции/подписи, имеющие определенную подпись.
Фокусировка на актуальном вопросе:
Можно ли передать функцию в качестве параметра
Да. Используйте AddressOf TheMethod
, чтобы передать метод другому методу. Тип аргумента должен быть делегатом, чья подпись соответствует типу целевого метода. Внутри метода вы обрабатываете параметр, как если бы это был фактический метод. Пример:
Sub Foo()
Console.WriteLine("Foo!")
End Sub
Sub Bar()
Console.WriteLine("Bar!")
End Sub
Sub CallSomething(f As Action)
f()
End Sub
' … somewhere:
CallSomething(AddressOf Foo)
CallSomething(AddressOf Bar)
Как я уже сказал, фактический тип параметра зависит от сигнатуры метода, который вы хотели бы передать. Используйте Action(Of T)
или Func(Of T)
или пользовательский тип делегата.
Однако во многих случаях его фактическое использование интерфейса вместо делегата имеет разные классы, реализующие ваш интерфейс, и передачу объектов этих разных классов в ваш метод.
Объявите свой параметр как Func(Of T)
или Action(Of T)
.
Какой из них следует использовать, зависит от вашей подписи методов. Я мог бы дать вам более точный ответ, если бы вы дали нам один.