带有args乱序的函数CallByName

时间:2017-10-06 23:39:15

标签: vb.net

我在vb.net中使用callbyname来调用带参数的另一个函数。但是参数顺序只在运行时才知道。所以我想用它的名字来定义参数,而不是args数组中的位置。

Private Sub mainSub()
    Dim argArr as Object()

    ReDim Preserve argArr(1)
    argArr(0) = "argTwo:= "Argument Two""
    argArr(1) = "argOne:= "Argument One""

    callbyname(auxSub, CallType.Method, argArr)
End Sub


Private Sub auxSub(ByVal argOne as String, ByVal argTwo as String)
    MsgBox("First Argument = " & argOne)
    MsgBox("Second Argument = " & argTwo)
End Sub

在此示例中,消息框将显示以下消息:

第一个论点 - argTwo:=“论证二”

第二个论点 - argOne:=“论证一个”

而不是:

第一个论点 - 参数一

第二个论点 - 参数二

1 个答案:

答案 0 :(得分:0)

一种可能令人讨厌的方法是让你的函数使用参数名称字典作为键并从argArr中赋值。如果你只是使用一种类型的值,例如你的例子中的字符串值,并且可能的参数数量相当小,你可以像下面的例子那样做,但是更复杂的东西,正如汉斯所说,你需要用反思来捣乱。

Private Sub mainSub()
    Dim argArr As Object()

    ReDim Preserve argArr(1)
    argArr(0) = "argTwo:= ""Argument Two"""
    argArr(1) = "argOne:= ""Argument One"""

    auxSub(argArr)
End Sub


Private Sub auxSub(argArray() As String)
    'define a dictionary of arguments and add valid argument names
    Dim ArgumentList As New Dictionary(Of String, String)
    ArgumentList.Add("argOne", "")
    ArgumentList.Add("argTwo", "")
    'Iterate through the argument array and assign the appropriate value to its matching dictionary key 
    For Each arg As String In argArray
        ArgumentList(Split(arg, " := ")(0)) = Split(arg, " := ")(1)
    Next

End Sub

当然,您需要更多代码来检查参数名称是否有效。