共用方式為


使用字串名稱呼叫屬性或方法 (Visual Basic)

在大部分情況下,您可以在設計階段探索物件的屬性和方法,並撰寫程式碼來處理這些項目。 不過,在某些情況下,您可能事先不知道物件的屬性和方法,或者您可能只是想要讓使用者擁有能在執行階段指定屬性或執行方法的彈性。

CallByName 函式

例如,假設用戶端應用程式會將運算子傳遞至 COM 元件,並藉此評估使用者輸入的運算式。 假設您不斷將新的函式新增至需要新運算子的元件。 當您使用標準物件存取技術時,必須先重新編譯並轉散發用戶端應用程式,才能使用新的運算子。 若要避免這種情況,您可以使用 CallByName 函式將新的運算子當做字串傳遞,而不需變更應用程式。

CallByName 函式可讓您在執行階段使用字串來指定屬性或方法。 CallByName 函式的簽章如下所示:

Result = CallByName(Object, ProcedureName, CallType, Arguments())

第一個引數 Object 會採用您要處理的物件名稱。 ProcedureName 引數會接受包含要叫用方法或屬性程序名稱的字串。 CallType 引數會接受常數,代表要叫用的程序類型:方法 (Microsoft.VisualBasic.CallType.Method)、讀取屬性 (Microsoft.VisualBasic.CallType.Get) 或屬性集 (Microsoft.VisualBasic.CallType.Set)。 Arguments 引數是選擇性的,會接受類型 Object 陣列,其中包含程序的任何引數。

您可以搭配目前方案中的類別使用 CallByName,但最常用來存取 COM 物件或來自 .NET Framework 組件的物件。

假設您加入包含名為 MathClass 的類別組件參考,其具有名為 SquareRoot 的新函式,如下列程式碼所示:

Class MathClass
    Function SquareRoot(ByVal X As Double) As Double
        Return Math.Sqrt(X)
    End Function
    Function InverseSine(ByVal X As Double) As Double
        Return Math.Atan(X / Math.Sqrt(-X * X + 1))
    End Function
    Function Acos(ByVal X As Double) As Double
        Return Math.Atan(-X / Math.Sqrt(-X * X + 1)) + 2 * Math.Atan(1)
    End Function
End Class

您的應用程式可以使用文字方塊控制項來控制將呼叫的方法及其引數。 例如,如果 TextBox1 包含要評估的運算式,並且 TextBox2 用來輸入函式的名稱,您可以使用下列程式碼在 TextBox1 中的運算式上叫用 SquareRoot 函式:

Private Sub CallMath()
    Dim Math As New MathClass
    Me.TextBox1.Text = CStr(CallByName(Math, Me.TextBox2.Text,
       Microsoft.VisualBasic.CallType.Method, TextBox1.Text))
End Sub

如果您在 TextBox1 中輸入「64」,並在 TextBox2 中輸入「SquareRoot」,然後呼叫 CallMath 程序,則會評估 TextBox1 中的數字平方根。 範例中的程式碼會叫用 SquareRoot 函式 (此函式會採用包含要評估為必要引數的字串),並在 TextBox1 中傳回「8」(即 64 的平方根)。 當然,如果使用者在 TextBox2 中輸入不正確字串,如果字串包含屬性的名稱而非方法,或方法有額外的必要引數,就會發生執行階段錯誤。 當您使用 CallByName 來預測這些錯誤或任何其他錯誤時,必須新增健全的錯誤處理常式代碼。

注意

雖然在某些情況下,CallByName 函式可能很有用,但您必須根據效能影響來衡量其效用性—使用 CallByName 叫用程序比晚期繫結呼叫速度略慢。 如果您要叫用重複呼叫的函式,例如迴圈內部,則 CallByName 可能會對效能造成嚴重影響。

另請參閱