대부분의 경우 디자인 타임에 개체의 속성과 메서드를 검색하고 이를 처리하는 코드를 작성할 수 있습니다. 그러나 경우에 따라 개체의 속성 및 메서드에 대해 미리 알지 못하거나 최종 사용자가 런타임에 속성을 지정하거나 메서드를 실행할 수 있도록 하는 유연성을 원할 수 있습니다.
CallByName 함수
예를 들어 연산자를 COM 구성 요소에 전달하여 사용자가 입력한 식을 평가하는 클라이언트 애플리케이션을 고려합니다. 새 연산자가 필요한 구성 요소에 새 함수를 지속적으로 추가한다고 가정해 보겠습니다. 표준 개체 액세스 기술을 사용하는 경우 클라이언트 애플리케이션을 다시 컴파일하고 재배포해야 새 연산자를 사용할 수 있습니다. 이를 방지하기 위해 애플리케이션을 CallByName
변경하지 않고 함수를 사용하여 새 연산자를 문자열로 전달할 수 있습니다.
이 CallByName
함수를 사용하면 문자열을 사용하여 런타임에 속성 또는 메서드를 지정할 수 있습니다. 함수의 CallByName
서명은 다음과 같습니다.
결과 = CallByName
(Object, ProcedureName, CallType, Arguments())
첫 번째 인수인 Object는 작업할 개체의 이름을 사용합니다.
ProcedureName 인수는 호출할 메서드 또는 속성 프로시저의 이름을 포함하는 문자열을 사용합니다.
CallType 인수는 호출할 프로시저의 형식을 나타내는 상수(메서드(), 속성 읽기(Microsoft.VisualBasic.CallType.Method
Microsoft.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
내부와 같이 반복적으로 호출되는 함수를 호출하는 경우 성능에 심각한 영향을 미칠 수 있습니다.
참고하십시오
.NET