文字列名によるプロパティまたはメソッドの呼び出し

更新 : 2007 年 11 月

ほとんどの場合、デザイン時にオブジェクトのプロパティとメソッドを調べ、オブジェクトに適切なコードを記述できます。ただし、オブジェクトのプロパティとメソッドをあらかじめ確認できない場合があります。また、実行時にプロパティの指定やメソッドの実行ができるような、柔軟なコードを記述する必要がある場合もあります。

CallByName 関数

たとえば、COM コンポーネントに演算子を渡すことによってユーザーが入力した式を評価する、クライアント アプリケーションなどが考えられます。新しい演算子を必要とするコンポーネントに新しい関数を繰り返し追加するとします。標準のオブジェクト アクセス方法を使用する場合は、クライアント アプリケーションの再コンパイルと再配布を行って、新しい演算子を使用できるようにする必要があります。これを避けるには、CallByName 関数を使用します。この関数を使用すると、アプリケーションを変更せずに、新しい演算子を文字列として渡すことができます。

CallByName 関数を使用すると、実行時にプロパティやメソッドを文字列で指定できます。CallByName 関数の使用方法を次に示します。

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

1 番目の引数 Object には、対象とするオブジェクトの名前を指定します。引数 ProcedureName には、呼び出すメソッドまたはプロパティ プロシージャの名前を文字列で指定します。引数 CallType には、呼び出すプロシージャの型を表す定数を指定します。メソッド呼び出しプロシージャの場合は Microsoft.VisualBasic.CallType.Method、プロパティ取得プロシージャの場合は Microsoft.VisualBasic.CallType.Get、プロパティ設定プロシージャの場合は Microsoft.VisualBasic.CallType.Set を指定します。任意で指定する引数 Arguments には、プロシージャに渡す引数を格納している Object 型の配列を指定します。

CallByName 関数は、現在のソリューションのクラスに対して使用できますが、一般的には、COM オブジェクトまたは .NET Framework アセンブリのオブジェクトにアクセスするときに使用します。

たとえば、次のコードに示すように、新しい関数 SquareRoot を持つ MathClass クラスを含むアセンブリへの参照を追加するとします。

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 関数を使用する場合は、信頼性の高いエラー処理コードを追加して、このようなエラーに対処する必要があります。

22x2chfx.alert_note(ja-jp,VS.90).gifメモ :

CallByName 関数を使用すると便利な場合もありますが、CallByName 関数を使用したプロシージャ呼び出しは、遅延バインディングによる呼び出しよりも速度が若干遅くなります。この関数を使用する場合には、利便性と性能面への影響とを比較検討する必要があります。ループ内などで、繰り返し実行される関数を呼び出す場合は、CallByName 関数の使用によってパフォーマンスが大幅に低下する可能性があります。

参照

処理手順

方法 : オブジェクトに対して複数のアクションを実行する

概念

オブジェクトの型の決定

参照

CallByName 関数

その他の技術情報

実行時のクラス情報の取得