文字列名によるプロパティまたはメソッドの呼び出し (Visual Basic)Calling a Property or Method Using a String Name (Visual Basic)

オブジェクトのプロパティやメソッドは、デザイン時に把握して、これらを処理するコードを作成できることがほとんどです。In most cases, you can discover the properties and methods of an object at design time, and write code to handle them. しかし、オブジェクトのプロパティやメソッドを事前に知ることができない場合や、実行時にエンド ユーザーがプロパティを指定したりメソッドを実行したりできる柔軟性を持たせたい場合があります。However, in some cases you may not know about an object's properties and methods in advance, or you may just want the flexibility of enabling an end user to specify properties or execute methods at run time.

CallByName 関数CallByName Function

例として、COM コンポーネントにユーザーが演算子を渡すことで入力した式を評価する、クライアント アプリケーションを考えます。Consider, for example, a client application that evaluates expressions entered by the user by passing an operator to a COM component. ここでは、新しい演算子が必要な新しい関数を、継続的にコンポーネントに追加するものとします。Suppose you are constantly adding new functions to the component that require new operators. 標準的なオブジェクトへのアクセス手法を使用する場合、新しい演算子を使用するには、クライアント アプリケーションを再コンパイルして配布し直す必要があります。When you use standard object access techniques, you must recompile and redistribute the client application before it could use the new operators. これは、CallByName 関数を使用して新しい演算子を文字列として渡すことで回避できます。アプリケーションを変更する必要はありません。To avoid this, you can use the CallByName function to pass the new operators as strings, without changing the application.

CallByName 関数を使用すると、文字列を使用して実行時にプロパティまたはメソッドを指定することができます。The CallByName function lets you use a string to specify a property or method at run time. CallByName 関数のシグネチャは次のようになります。The signature for the CallByName function looks like this:

Result = CallByName(<オブジェクト>, <プロシージャ名>, <呼び出しの型>, <引数>())Result = CallByName(Object, ProcedureName, CallType, Arguments())

最初の引数である <オブジェクト> は、処理対象のオブジェクトの名前を取ります。The first argument, Object, takes the name of the object you want to act upon. <プロシージャ名> 引数は、呼び出すメソッドまたはプロパティのプロシージャ名を含んだ文字列を取ります。The ProcedureName argument takes a string that contains the name of the method or property procedure to be invoked. <呼び出しの型> 引数は、メソッド (Microsoft.VisualBasic.CallType.Method)、読み取り対象のプロパティ (Microsoft.VisualBasic.CallType.Get)、設定対象のプロパティ (Microsoft.VisualBasic.CallType.Set) のいずれかのうち、呼び出すプロシージャの型を表す定数を取ります。The CallType argument takes a constant that represents the type of procedure to invoke: a method (Microsoft.VisualBasic.CallType.Method), a property read (Microsoft.VisualBasic.CallType.Get), or a property set (Microsoft.VisualBasic.CallType.Set). <引数> 引数は省略可能であり、プロシージャに渡す引数が含まれる Object 型の配列を取ります。The Arguments argument, which is optional, takes an array of type Object that contains any arguments to the procedure.

CallByName は、現在のソリューションのクラスと共に使用できますが、多くの場合は、COM オブジェクトまたは .NET Framework アセンブリのオブジェクトにアクセスするために使用します。You can use CallByName with classes in your current solution, but it is most often used to access COM objects or objects from .NET Framework assemblies.

次のコードに示すように、SquareRoot という名前の新しい関数を持つ、MathClass という名前のクラスが含まれるアセンブリへの参照を追加するとします。Suppose you add a reference to an assembly that contains a class named MathClass, which has a new function named SquareRoot, as shown in the following code:

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

アプリケーションでテキスト ボックス コントロールを使用して、呼び出し対象のメソッドとその引数を制御できます。Your application could use text box controls to control which method will be called and its arguments. たとえば、TextBox1 に評価対象の式が含まれており、TextBox2 を使用して関数名を入力する場合、次のコードを使用することで、TextBox1 内の式を対象とする SquareRoot 関数を呼び出すことができます。For example, if TextBox1 contains the expression to be evaluated, and TextBox2 is used to enter the name of the function, you can use the following code to invoke the SquareRoot function on the expression in 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

TextBox1 に「64」、TextBox2 に「SquareRoot」と入力してから CallMath プロシージャを呼び出すと、TextBox1 に含まれる数字の平方根が算出されます。If you enter "64" in TextBox1, "SquareRoot" in TextBox2, and then call the CallMath procedure, the square root of the number in TextBox1 is evaluated. この例のコードでは、SquareRoot 関数 (評価対象の式が含まれる文字列を必須引数として取ります) を呼び出して、TextBox1 で "8" (64 の平方根) を返します。The code in the example invokes the SquareRoot function (which takes a string that contains the expression to be evaluated as a required argument) and returns "8" in TextBox1 (the square root of 64). 当然のことながら、ユーザーが TextBox2 に無効な文字列を入力するか、文字列にメソッド名ではなくプロパティ名が含まれているか、メソッドに追加の必須引数がある場合には、実行時エラーが発生します。Of course, if the user enters an invalid string in TextBox2, if the string contains the name of a property instead of a method, or if the method had an additional required argument, a run-time error occurs. CallByName を使用するときには、こうしたエラーやその他のエラーも考慮して、堅牢なエラー処理コードを追加する必要があります。You have to add robust error-handling code when you use CallByName to anticipate these or any other errors.

注意

CallByName 関数は便利な場合もありますが、その有用性をパフォーマンスに対する影響と比較して考慮するようにしてください。CallByName を使用してプロシージャを呼び出すと、遅延バインディング呼び出しに比べてやや時間がかかります。While the CallByName function may be useful in some cases, you must weigh its usefulness against the performance implications — using CallByName to invoke a procedure is slightly slower than a late-bound call. ループ内など、繰り返し呼び出される関数を呼び出す場合、CallByName を使用するとパフォーマンスに著しい負荷がかかる可能性があります。If you are invoking a function that is called repeatedly, such as inside a loop, CallByName can have a severe effect on performance.

関連項目See also