2017-10-06 45 views
-1

我在vb.net中使用callbyname來調用具有參數的另一個函數。但是參數順序只在運行時才知道。所以我想通過它的名字來定義參數,而不是args數組中的位置。函數CallByName的參數不正確

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 

在這個例子中在MessageBox將顯示以下信息:

第一個參數 - argTwo:= 「參數兩個」

第二個參數 - argOne:= 「參數的一個」

而不是:

第一個參數 - 論證一個

第二個參數 - 參數兩個這樣做將是使用你的函數的參數名稱爲重點的字典,並從argArr賦值的

+1

您將不得不使用反射。 ParameterInfo提供參數名稱。你*真正想做這件事的機率應該很低。 –

+0

爲什麼你認爲你首先需要做到這一點?這可能是合法的,但我看到不止一個人無緣無故嘗試這種事情。 – jmcilhinney

+0

原因是用戶可以用他想要的項目和順序創建一個用戶窗體。而表單控件是該函數的參數。我會盡力瞭解更多關於反射功能。謝謝! – marceloguaycurus

回答

0

一個可能討厭的方式。如果你只是使用一種類型的值,比如你的例子中的字符串值,並且可能的參數數量相當小,你可以像下面的例子那樣做,但是更復雜的東西,正如漢斯所說,你需要用反射來解決問題。

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 

你當然需要更多的代碼來檢查參數名是否有效。