次の方法で共有


MethodBase.Invoke メソッド (Object, Object )

この MethodInfo オブジェクトで表される基になるメソッドまたはコンストラクタを、指定したパラメータで呼び出します。

Overloads Public Function Invoke( _
   ByVal obj As Object, _   ByVal parameters() As Object _) As Object
[C#]
public object Invoke(objectobj,object[] parameters);
[C++]
public: Object* Invoke(Object* obj,Object* parameters __gc[]);
[JScript]
public function Invoke(
   obj : Object,parameters : Object[]) : Object;

パラメータ

  • obj
    このメソッドを作成したインスタンス。

  • parameters
    呼び出すメソッドまたはコンストラクタの引数リスト。これは、呼び出すメソッドまたはコンストラクタのパラメータと同じ数、順序、および型のオブジェクトの配列です。パラメータがない場合は、 null 参照 (Visual Basic では Nothing) にします。

    このインスタンスで表されるメソッドまたはコンストラクタが ByRef パラメータをとる場合、この関数を使用してメソッドまたはコンストラクタを呼び出すために、このパラメータに特別な属性は必要ありません。この配列の中で、何らかの値で明示的に初期化されないオブジェクトには、そのオブジェクト型の既定値が格納されます。参照型の要素の場合、この値は null 参照 (Nothing) です。値型の要素の場合、この値は、実際の要素の型に応じて、0、0.0、または false となります。

戻り値

呼び出されたメソッドの戻り値を格納しているオブジェクト。コンストラクタの場合は、再初期化されたオブジェクト。

例外

例外の種類 条件
TargetException obj パラメータが null 参照 (Visual Basic では Nothing) で、メソッドが静的でありません。

または

メソッドが、 obj のクラスで宣言も継承もされていません。

ArgumentException parameters パラメータの型が、このインスタンスでリフレクションされたメソッドまたはコンストラクタのシグネチャと一致しません。
TargetInvocationException 呼び出されたメソッドまたはコンストラクタが例外をスローします。
TargetParameterCountException parameters 配列に、正しい数の引数の型が格納されていません。
MethodAccessException 呼び出し元に、このコンストラクタを実行するためのアクセス許可がありません。

解説

パラメータの既定値が設定されたメソッドを呼び出すには、このメソッドを使用します。これらのメソッドにバインドするには、リフレクションのバインディング フラグである DefaultValueBindingDefaultValueChangeType 、または DefaultValueFull のいずれか 1 つを明示的に指定する必要があります。この指定は、既定値が設定されたパラメータに対して値が渡される場合にも必要です。

たとえば、 MyMethod(int x, float y = 2.0) というメソッドがあるとします。このメソッドを MyMethod(4) というように最初の引数だけを指定して呼び出すには、上記のバインディング フラグのうち 1 つを渡し、最初の引数には 4、第 2 の引数には Missing.Value という 2 つの引数を渡します。Invoke メソッドでは、 Missing.Value を使用する場合を除いて、オプションのパラメータを省略することはできません。オプションのパラメータを省略する必要のある場合は、代わりに InvokeMember を使用してください。

これは、他のパラメータに null 参照 (Visual Basic では Nothing) を渡して次の Invoke メソッドを呼び出す便宜的なメソッドです。呼び出されたメソッドが例外をスローした場合、 GetBaseException は例外を返します。

MethodInfo オブジェクトを使用して静的メソッドを呼び出すには、次の呼び出しに示すように、最初のパラメータを null 参照 (Nothing) にする必要があります。

Object myReturnValue = myMethodInfo.Invoke(null, myParametersArray);

使用例

リフレクションを使用して動的メソッド検索を行う例を次に示します。クラス A とクラス B のメソッドは仮想メソッド (Visual Basic では Overridable) であるため、すべての呼び出しで 1 が返されることに注意してください。

 
Public Class A
    Public Overridable Function method() As Integer
        Return 0
    End Function
End Class

Public Class B
    Public Overridable Function method() As Integer
        Return 1
    End Function
End Class

Class Mymethodinfo

    Public Shared Function Main() As Integer
        Console.WriteLine("Reflection.MethodInfo")
        Console.WriteLine()
        Dim MyA As New A()
        Dim MyB As New B()

        'Get the Type and MethodInfo
        Dim MyTypea As Type = Type.GetType("A")
        Dim Mymethodinfoa As MethodInfo = MyTypea.GetMethod("method")

        Dim MyTypeb As Type = Type.GetType("B")
        Dim Mymethodinfob As MethodInfo = MyTypeb.GetMethod("method")

        'Get and display the Invoke method
        Console.WriteLine("First method - {0} returns {1}", MyTypea.FullName, _
            Mymethodinfoa.Invoke(MyA, Nothing).ToString())
        Console.WriteLine("Second method - {0} returns {1}", MyTypeb.FullName, _
           Mymethodinfob.Invoke(MyB, Nothing).ToString())
        Return 0
    End Function
End Class

[C#] 
using System;
using System.Reflection;
using System.Windows.Forms;

public class A
{
    public virtual int method () {return 0;}
}
 
public class B
{
    public virtual int method () {return 1;}
}
 
class Mymethodinfo
{
    public static int Main()
    {
        Console.WriteLine ("\nReflection.MethodInfo");
        A MyA = new A();
        B MyB = new B();
 
        // Get the Type and MethodInfo.
        Type MyTypea = Type.GetType("A");
        MethodInfo Mymethodinfoa = MyTypea.GetMethod("method");
 
        Type MyTypeb = Type.GetType("B");
        MethodInfo Mymethodinfob = MyTypeb.GetMethod("method");
 
        // Get and display the Invoke method.
        Console.Write("\nFirst method - " + MyTypea.FullName +
            " returns " + Mymethodinfoa.Invoke(MyA, null));
        Console.Write("\nSecond method - " + MyTypeb.FullName +
            " returns " + Mymethodinfob.Invoke(MyB, null));
        return 0;
    }
}

[C++] 
#using <mscorlib.dll>
#using <System.DLL>

using namespace System;
using namespace System::Reflection;

#define NULL 0

__gc class A : public Object
{
    public:
    virtual int method() { return 0;}
};

__gc class B : public A
{
    public:
    virtual int method() { return 1;}
};

int main ()
{
    A *objA = new A();
    B *objB = new B();

    Type *typeA = objA->GetType();
    Type *typeB = objB->GetType();

    MethodInfo *methodA = typeA->GetMethod(L"method");
    MethodInfo *methodB = typeB->GetMethod(L"method");

    Console::WriteLine(S"\tUsing reflection to invoke A::method on objB returns {0}.",
             dynamic_cast<Object *>(methodA->Invoke(objB, NULL)));
    Console::WriteLine(S"\tUsing Invoke on objB after converting to type A returns {0}.",
             dynamic_cast<Object *>(methodA->Invoke(dynamic_cast<A *>(objB), NULL)));

    Console::WriteLine(S"\r\nThe same behavior is seen when the method ");
    Console::WriteLine(S"is invoked without reflection:\r\n");

    Console::WriteLine(S"\tDirectly invoking B::method on objB returns {0}.",
             __box(objB->method()) );
    Console::WriteLine(S"\tDirectly invoking B::method on objB after converting to type A returns {0}.",
             __box(dynamic_cast<A *>(objB)->method()));
};

[JScript] 
public class A
{
   public function method () : int {return 0;}
}

public class B
{
   public function method () : int {return 1;}
}

class Mymethodinfo
{
   public static function Main() : void
   {
      Console.WriteLine ("\nReflection.MethodInfo");
      var MyA : A = new A();
      var MyB : B = new B();

      //Get the Type and MethodInfo
      var MyTypea : Type = Type.GetType("A");
      var Mymethodinfoa : MethodInfo = MyTypea.GetMethod("method");

      var MyTypeb : Type = Type.GetType("B");
      var Mymethodinfob : MethodInfo = MyTypeb.GetMethod("method");

      //Get and display the Invoke method
      Console.Write("\nFirst method - " + MyTypea.FullName +
         " returns " + Mymethodinfoa.Invoke(MyA, null));
      Console.Write("\nSecond method - " + MyTypeb.FullName +
         " returns " + Mymethodinfob.Invoke(MyB, null));
    }
}
Mymethodinfo.Main();

必要条件

プラットフォーム: Windows 98, Windows NT 4.0, Windows Millennium Edition, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003 ファミリ, .NET Compact Framework - Windows CE .NET, Common Language Infrastructure (CLI) Standard

.NET Framework セキュリティ:

参照

MethodBase クラス | MethodBase メンバ | System.Reflection 名前空間 | MethodBase.Invoke オーバーロードの一覧 | BindingFlags | Missing | InvokeMember