다음을 통해 공유


문자열 이름을 사용하여 속성 또는 메서드 호출(Visual Basic)

대부분의 경우 디자인 타임에 개체의 속성과 메서드를 검색하고 이를 처리하는 코드를 작성할 수 있습니다. 그러나 경우에 따라 개체의 속성 및 메서드에 대해 미리 알지 못하거나 최종 사용자가 런타임에 속성을 지정하거나 메서드를 실행할 수 있도록 하는 유연성을 원할 수 있습니다.

CallByName 함수

예를 들어 연산자를 COM 구성 요소에 전달하여 사용자가 입력한 식을 평가하는 클라이언트 애플리케이션을 고려합니다. 새 연산자가 필요한 구성 요소에 새 함수를 지속적으로 추가한다고 가정해 보겠습니다. 표준 개체 액세스 기술을 사용하는 경우 클라이언트 애플리케이션을 다시 컴파일하고 재배포해야 새 연산자를 사용할 수 있습니다. 이를 방지하기 위해 애플리케이션을 CallByName 변경하지 않고 함수를 사용하여 새 연산자를 문자열로 전달할 수 있습니다.

CallByName 함수를 사용하면 문자열을 사용하여 런타임에 속성 또는 메서드를 지정할 수 있습니다. 함수의 CallByName 서명은 다음과 같습니다.

결과 = CallByName(Object, ProcedureName, CallType, Arguments())

첫 번째 인수인 Object는 작업할 개체의 이름을 사용합니다. ProcedureName 인수는 호출할 메서드 또는 속성 프로시저의 이름을 포함하는 문자열을 사용합니다. CallType 인수는 호출할 프로시저의 형식을 나타내는 상수(메서드(), 속성 읽기(Microsoft.VisualBasic.CallType.MethodMicrosoft.VisualBasic.CallType.Get) 또는 속성 집합(Microsoft.VisualBasic.CallType.Set)을 사용합니다. 선택 사항인 인수 인수는 프로시저에 대한 인수를 포함하는 형식 Object 의 배열을 사용합니다.

현재 솔루션에서 클래스와 함께 CallByName를 사용할 수 있으며 .NET Framework 어셈블리의 COM 개체나 객체에 액세스하는 데 가장 자주 사용됩니다.

다음 코드와 같이 새 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에 함수 이름을 입력할 때 사용된다면, 다음 코드를 사용하여 SquareRoot의 식에서 TextBox1 함수를 호출할 수 있습니다.

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

에 "64" TextBox1, "SquareRoot" TextBox2를 입력한 다음 프로시저를 CallMath 호출하면 숫자 TextBox1 의 제곱근이 계산됩니다. 예제의 코드는 SquareRoot 함수를 호출하고 (이를 위해 평가할 식을 포함하는 문자열을 필수 인수로 받습니다), TextBox1에서 "8" (64의 제곱근)을 반환합니다. 물론 사용자가 잘못된 문자열 TextBox2을 입력하는 경우, 문자열에 메서드 대신 속성 이름이 포함되어 있거나 메서드에 추가 필수 인수가 있는 경우 런타임 오류가 발생합니다. 이러한 오류 또는 기타 오류를 예상하는 데 사용할 CallByName 때 강력한 오류 처리 코드를 추가해야 합니다.

비고

함수가 CallByName 경우에 따라 유용할 수 있지만, CallByName을 사용하여 프로시저를 호출하는 것이 늦게 바인딩된 호출보다 약간 느려 성능에 미치는 영향을 고려하여 유용성을 평가해야 합니다. 루프 CallByName 내부와 같이 반복적으로 호출되는 함수를 호출하는 경우 성능에 심각한 영향을 미칠 수 있습니다.

참고하십시오