Эффективный и практичный способ передачи функции в качестве параметра, когда функция может иметь переменное число аргументов в VB. Net? - PullRequest
0 голосов
/ 14 апреля 2020

Я хотел бы построить класс, который работает с данной математической функцией. Данная математическая функция может быть простой или очень сложной, но всегда будет иметь:

  • одну независимую переменную
  • один результат для этой переменной
  • неизвестно и потенциально большое количество констант

Ради аргумента, скажем, я просто хочу напечатать результат этих функций, в действительности операции будут сложными (например, итерация для поиска root).

Я не уверен в лучшем способе выполнения sh этого, кроме добавления переменного числа аргументов в словарь, чтобы я всегда мог передать данную функцию в качестве делегата.

Вот что у меня есть:

Sub RunTest()
    Dim myvars As New Dictionary(Of String, Double) From {
        {"a", 3},
        {"b", 2},
        {"c", 1},
        {"d", -1}
    }

    Dim MyTest1, MyTest2 As MyTestClass

    MyTest1 = New MyTestClass(AddressOf CubicTest, 1.123, myvars)
    MyTest2 = New MyTestClass(AddressOf QuadTest, 1.123, myvars)
    MyTest1.TestPrint()
    MyTest2.TestPrint()
End Sub

Function CubicTest(ByVal xAs Double, ByVal var As Dictionary(Of String, Double)) As Double
    Return var("a") * x^ 3 + var("b") * x^ 2 + var("c") * x + var("d")
End Function

Function QuadTest(ByVal xAs Double, ByVal var As Dictionary(Of String, Double)) As Double
    Return var("b") * x^ 2 + var("c") * x + var("d")
End Function

Class MyTestClass
    Private BaseFunction As FunctionByRef
    Private TestValue As Double
    Private Variables As Dictionary(Of String, Double)

    Delegate Function FunctionByRef(ByVal TestValue As Double, ByVal Variables As Dictionary(Of String, Double)) As Double

    Sub New(ByVal BaseFunction As FunctionByRef, ByVal TestValue As Double, ByVal Variables As Dictionary(Of String, Double))
        Me.BaseFunction = BaseFunction
        Me.TestValue = TestValue
        Me.Variables = Variables
    End Sub

    Sub TestPrint()
        Debug.Print(Me.BaseFunction(Me.TestValue, Me.Variables).ToString())
    End Sub

End Class

, который, кажется, работает просто отлично, но также выглядит очень неуклюже.

Есть ли более чистый способ достижения sh это?

1 Ответ

0 голосов
/ 14 апреля 2020

В качестве общего примера:

Private Sub ExecuteDoubleFunction(method As [Delegate], ParamArray args As Object())
    Dim result = DirectCast(method.DynamicInvoke(args), Double)

    'Use result here.
End Sub

Затем в этот метод можно передать любой делегат с типом возврата Double и передать аргументы в виде одного массива или в виде дискретных значений. Это означает, что вы можете использовать AddressOf для создания делегата для обычного метода использования лямбда-выражения.

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