Type.InvokeMember メソッド

定義

現在の Type の特定のメンバーを呼び出します。

オーバーロード

InvokeMember(String, BindingFlags, Binder, Object, Object[])

指定したバインディング制約を使用し、指定した引数リストと照合して、指定したメンバーを呼び出します。

InvokeMember(String, BindingFlags, Binder, Object, Object[], CultureInfo)

指定したバインディング制約を使用し、指定したメンバーのうち、指定した引数リストおよびカルチャと一致するメンバーを呼び出します。

InvokeMember(String, BindingFlags, Binder, Object, Object[], ParameterModifier[], CultureInfo, String[])

派生クラス内でオーバーライドされた場合、指定したバインディング制約を使用し、指定した引数リスト、修飾子、カルチャと照合して、指定されたメンバーを呼び出します。

InvokeMember(String, BindingFlags, Binder, Object, Object[])

指定したバインディング制約を使用し、指定した引数リストと照合して、指定したメンバーを呼び出します。

public:
 System::Object ^ InvokeMember(System::String ^ name, System::Reflection::BindingFlags invokeAttr, System::Reflection::Binder ^ binder, System::Object ^ target, cli::array <System::Object ^> ^ args);
public:
 virtual System::Object ^ InvokeMember(System::String ^ name, System::Reflection::BindingFlags invokeAttr, System::Reflection::Binder ^ binder, System::Object ^ target, cli::array <System::Object ^> ^ args);
public object? InvokeMember (string name, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder? binder, object? target, object?[]? args);
public object InvokeMember (string name, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder binder, object target, object[] args);
member this.InvokeMember : string * System.Reflection.BindingFlags * System.Reflection.Binder * obj * obj[] -> obj
abstract member InvokeMember : string * System.Reflection.BindingFlags * System.Reflection.Binder * obj * obj[] -> obj
override this.InvokeMember : string * System.Reflection.BindingFlags * System.Reflection.Binder * obj * obj[] -> obj
Public Function InvokeMember (name As String, invokeAttr As BindingFlags, binder As Binder, target As Object, args As Object()) As Object

パラメーター

name
String

呼び出すコンストラクター、メソッド、プロパティ、またはフィールド メンバーの名前を格納している文字列。

または

既定メンバーを呼び出すための空の文字列 ("")。

または

IDispatch メンバーの場合は、"[DispID=3]" のように DispID を表す文字列。

invokeAttr
BindingFlags

検索を実施する方法を指定する列挙値のビットごとの組み合わせ。 アクセスは、BindingFlagsPublicNonPublicPrivateInvokeMethod など、GetField のうちの 1 つになります。 検索の種類を指定する必要はありません。 検索の種類が省略されている場合は、BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static を使用します。

binder
Binder

一連のプロパティを定義し、バインディングを有効にするオブジェクト。バインディングには、オーバーロードされたメソッドの選択、引数の型の強制変換、リフレクションによるメンバーの呼び出しなどが含まれます。

または

Nothing を使用する場合は、null 参照 (Visual Basic の場合は DefaultBinder)。 可変個の引数を指定してメソッド オーバーロードを正常に呼び出すには、Binder オブジェクトを明示的に定義することが必要な場合があるのでご注意ください。

target
Object

指定したメンバーを呼び出す対象となるオブジェクト。

args
Object[]

呼び出すメンバーに渡される引数を格納する配列。

戻り値

呼び出されるメンバーの戻り値を表すオブジェクト。

実装

例外

invokeAttrCreateInstance が含まれず、namenull です。

invokeAttr が有効な BindingFlags 属性ではありません。

または

invokeAttr にバインド フラグ InvokeMethodCreateInstanceGetFieldSetFieldGetPropertySetPropertyのいずれかが含まれていません。

または

invokeAttr に、 CreateInstanceInvokeMethodGetFieldSetFieldGetPropertySetPropertyとの組み合わせが含まれています。

または

invokeAttrGetFieldSetFieldの両方が含まれています。

または

invokeAttrGetPropertySetPropertyの両方が含まれています。

または

invokeAttr に、 InvokeMethodSetField または SetPropertyとの組み合わせが含まれています。

または

invokeAttrSetField が含まれており、 args に複数の要素があります。

または

COM オブジェクトでこのメソッドが呼び出され、バインド フラグ BindingFlags.InvokeMethodBindingFlags.GetPropertyBindingFlags.SetPropertyBindingFlags.PutDispPropertyBindingFlags.PutRefDispProperty のいずれかが渡されませんでした。

または

名前付きパラメーター配列の 1 つに、 nullである文字列が含まれています。

指定されたメンバーは、クラス初期化子です。

フィールドまたはプロパティが見つかりません。

args 内の引数と一致するメソッドが見つかりません。

または

現在の Type オブジェクトは、オープン型のパラメーターを含む型を表します。つまり、ContainsGenericParameterstrue を返します。

指定されたメンバーを target で呼び出すことができません。

複数のメソッドがバインディングの基準と一致します。

現在、.NET Compact Framework は、このメソッドをサポートしていません。

name によって表されるメソッドに、1 つ以上の未指定のジェネリック型パラメーターがあります。 つまり、このメソッドの ContainsGenericParameters プロパティが true を返します。

次の例では、 を使用 InvokeMember して 型のメンバーにアクセスします。

using namespace System;
using namespace System::Reflection;

// This sample class has a field, constructor, method, and property.
ref class MyType
{
private:
   Int32 myField;

public:
   MyType( interior_ptr<Int32> x )
   {
       *x *= 5;
   }

   virtual String^ ToString() override
   {
      return myField.ToString();
   }

   property Int32 MyProp 
   {
      Int32 get()
      {
         return myField;
      }

      void set( Int32 value )
      {
         if ( value < 1 )
                  throw gcnew ArgumentOutOfRangeException( "value",value,"value must be > 0" );

         myField = value;
      }
   }
};

int main()
{
   Type^ t = MyType::typeid;

   // Create an instance of a type.
   array<Object^>^args = {8};
   Console::WriteLine( "The value of x before the constructor is called is {0}.", args[ 0 ] );
   Object^ obj = t->InvokeMember( nullptr, static_cast<BindingFlags>(BindingFlags::DeclaredOnly | BindingFlags::Public | BindingFlags::NonPublic | BindingFlags::Instance | BindingFlags::CreateInstance), nullptr, nullptr, args );
   Console::WriteLine( "Type: {0}", obj->GetType() );
   Console::WriteLine( "The value of x after the constructor returns is {0}.", args[ 0 ] );

   // Read and write to a field.
   array<Object^>^obj5 = {5};
   t->InvokeMember( "myField", static_cast<BindingFlags>(BindingFlags::DeclaredOnly | BindingFlags::Public | BindingFlags::NonPublic | BindingFlags::Instance | BindingFlags::SetField), nullptr, obj, obj5 );
   Int32 v = safe_cast<Int32>(t->InvokeMember( "myField", static_cast<BindingFlags>(BindingFlags::DeclaredOnly | BindingFlags::Public | BindingFlags::NonPublic | BindingFlags::Instance | BindingFlags::GetField), nullptr, obj, nullptr ));
   Console::WriteLine( "myField: {0}", v );

   // Call a method.
   String^ s = safe_cast<String^>(t->InvokeMember( "ToString", static_cast<BindingFlags>(BindingFlags::DeclaredOnly | BindingFlags::Public | BindingFlags::NonPublic | BindingFlags::Instance | BindingFlags::InvokeMethod), nullptr, obj, nullptr ));
   Console::WriteLine( "ToString: {0}", s );

   // Read and write a property. First, attempt to assign an
   // invalid value; then assign a valid value; finally, get
   // the value.
   try
   {
      // Assign the value zero to MyProp. The Property Set 
      // throws an exception, because zero is an invalid value.
      // InvokeMember catches the exception, and throws 
      // TargetInvocationException. To discover the real cause
      // you must catch TargetInvocationException and examine
      // the inner exception. 
      array<Object^>^obj0 = {(int^)0};
      t->InvokeMember( "MyProp", static_cast<BindingFlags>(BindingFlags::DeclaredOnly | BindingFlags::Public | BindingFlags::NonPublic | BindingFlags::Instance | BindingFlags::SetProperty), nullptr, obj, obj0 );
   }
   catch ( TargetInvocationException^ e ) 
   {
      // If the property assignment failed for some unexpected
      // reason, rethrow the TargetInvocationException.
      if ( e->InnerException->GetType() != ArgumentOutOfRangeException::typeid )
            throw;

      Console::WriteLine( "An invalid value was assigned to MyProp." );
   }

   array<Object^>^obj2 = {2};
   t->InvokeMember( "MyProp", static_cast<BindingFlags>(BindingFlags::DeclaredOnly | BindingFlags::Public | BindingFlags::NonPublic | BindingFlags::Instance | BindingFlags::SetProperty), nullptr, obj, obj2 );
   v =  safe_cast<Int32>(t->InvokeMember( "MyProp", static_cast<BindingFlags>(BindingFlags::DeclaredOnly | BindingFlags::Public | BindingFlags::NonPublic | BindingFlags::Instance | BindingFlags::GetProperty), nullptr, obj, nullptr ));
   Console::WriteLine( "MyProp: {0}", v );
}
using System;
using System.Reflection;

// This sample class has a field, constructor, method, and property.
class MyType
{
    Int32 myField;
    public MyType(ref Int32 x) {x *= 5;}
    public override String ToString() {return myField.ToString();}
    public Int32 MyProp
    {
        get {return myField;}
        set
        {
            if (value < 1)
                throw new ArgumentOutOfRangeException("value", value, "value must be > 0");
            myField = value;
        }
    }
}

class MyApp
{
    static void Main()
    {
        Type t = typeof(MyType);
        // Create an instance of a type.
        Object[] args = new Object[] {8};
        Console.WriteLine("The value of x before the constructor is called is {0}.", args[0]);
        Object obj = t.InvokeMember(null,
            BindingFlags.DeclaredOnly |
            BindingFlags.Public | BindingFlags.NonPublic |
            BindingFlags.Instance | BindingFlags.CreateInstance, null, null, args);
        Console.WriteLine("Type: " + obj.GetType().ToString());
        Console.WriteLine("The value of x after the constructor returns is {0}.", args[0]);

        // Read and write to a field.
        t.InvokeMember("myField",
            BindingFlags.DeclaredOnly |
            BindingFlags.Public | BindingFlags.NonPublic |
            BindingFlags.Instance | BindingFlags.SetField, null, obj, new Object[] {5});
        Int32 v = (Int32) t.InvokeMember("myField",
            BindingFlags.DeclaredOnly |
            BindingFlags.Public | BindingFlags.NonPublic |
            BindingFlags.Instance | BindingFlags.GetField, null, obj, null);
        Console.WriteLine("myField: " + v);

        // Call a method.
        String s = (String) t.InvokeMember("ToString",
            BindingFlags.DeclaredOnly |
            BindingFlags.Public | BindingFlags.NonPublic |
            BindingFlags.Instance | BindingFlags.InvokeMethod, null, obj, null);
        Console.WriteLine("ToString: " + s);

        // Read and write a property. First, attempt to assign an
        // invalid value; then assign a valid value; finally, get
        // the value.
        try
        {
            // Assign the value zero to MyProp. The Property Set
            // throws an exception, because zero is an invalid value.
            // InvokeMember catches the exception, and throws
            // TargetInvocationException. To discover the real cause
            // you must catch TargetInvocationException and examine
            // the inner exception.
            t.InvokeMember("MyProp",
                BindingFlags.DeclaredOnly |
                BindingFlags.Public | BindingFlags.NonPublic |
                BindingFlags.Instance | BindingFlags.SetProperty, null, obj, new Object[] {0});
        }
        catch (TargetInvocationException e)
        {
            // If the property assignment failed for some unexpected
            // reason, rethrow the TargetInvocationException.
            if (e.InnerException.GetType() !=
                typeof(ArgumentOutOfRangeException))
                throw;
            Console.WriteLine("An invalid value was assigned to MyProp.");
        }
        t.InvokeMember("MyProp",
            BindingFlags.DeclaredOnly |
            BindingFlags.Public | BindingFlags.NonPublic |
            BindingFlags.Instance | BindingFlags.SetProperty, null, obj, new Object[] {2});
        v = (Int32) t.InvokeMember("MyProp",
            BindingFlags.DeclaredOnly |
            BindingFlags.Public | BindingFlags.NonPublic |
            BindingFlags.Instance | BindingFlags.GetProperty, null, obj, null);
        Console.WriteLine("MyProp: " + v);
    }
}
open System
open System.Reflection

// This sample class has a field, constructor, method, and property.
type MyType() =
    let mutable myField = 0

    member _.MyType(x: int byref) =
        x <- x * 5
    
    override _.ToString() =
        string myField
    
    member _.MyProp
        with get () = myField
        and set value =
            if value < 1 then
                raise (ArgumentOutOfRangeException("value", value, "value must be > 0"))
            myField <- value

let t = typeof<MyType>
// Create an instance of a type.
let args = Array.zeroCreate<obj> 8
printfn $"The value of x before the constructor is called is {args[0]}."
let obj = t.InvokeMember(null,
    BindingFlags.DeclaredOnly |||
    BindingFlags.Public ||| BindingFlags.NonPublic |||
    BindingFlags.Instance ||| BindingFlags.CreateInstance, null, null, args)
printfn $"Type: {obj.GetType()}"
printfn $"The value of x after the constructor returns is {args[0]}."

// Read and write to a field.
t.InvokeMember("myField",
    BindingFlags.DeclaredOnly |||
    BindingFlags.Public ||| BindingFlags.NonPublic |||
    BindingFlags.Instance ||| BindingFlags.SetField, null, obj, Array.zeroCreate<obj> 5) |> ignore
let v = t.InvokeMember("myField",
    BindingFlags.DeclaredOnly |||
    BindingFlags.Public ||| BindingFlags.NonPublic |||
    BindingFlags.Instance ||| BindingFlags.GetField, null, obj, null) :?> int
printfn $"myField: {v}"

// Call a method.
let s = t.InvokeMember("ToString",
    BindingFlags.DeclaredOnly |||
    BindingFlags.Public ||| BindingFlags.NonPublic |||
    BindingFlags.Instance ||| BindingFlags.InvokeMethod, null, obj, null) :?> string
printfn $"ToString: {s}"

// Read and write a property. First, attempt to assign an
// invalid value then assign a valid value finally, get
// the value.
try
    // Assign the value zero to MyProp. The Property Set
    // throws an exception, because zero is an invalid value.
    // InvokeMember catches the exception, and throws
    // TargetInvocationException. To discover the real cause
    // you must catch TargetInvocationException and examine
    // the inner exception.
    t.InvokeMember("MyProp",
        BindingFlags.DeclaredOnly |||
        BindingFlags.Public ||| BindingFlags.NonPublic |||
        BindingFlags.Instance ||| BindingFlags.SetProperty, null, obj, Array.zeroCreate<obj> 0) |> ignore
with :? TargetInvocationException as e ->
    // If the property assignment failed for some unexpected
    // reason, rethrow the TargetInvocationException.
    if e.InnerException.GetType() <> typeof<ArgumentOutOfRangeException> then
        reraise ()
    printfn "An invalid value was assigned to MyProp."
t.InvokeMember("MyProp",
    BindingFlags.DeclaredOnly |||
    BindingFlags.Public ||| BindingFlags.NonPublic |||
    BindingFlags.Instance ||| BindingFlags.SetProperty, null, obj, Array.zeroCreate<obj> 2) |> ignore
let v2 = t.InvokeMember("MyProp",
    BindingFlags.DeclaredOnly |||
    BindingFlags.Public ||| BindingFlags.NonPublic |||
    BindingFlags.Instance ||| BindingFlags.GetProperty, null, obj, null)
printfn $"MyProp: {v2}"
Imports System.Reflection

' This sample class has a field, constructor, method, and property.
Class MyType
    Private myField As Int32

    Public Sub New(ByRef x As Int32)
        x *= 5
    End Sub

    Public Overrides Function ToString() As [String]
        Return myField.ToString()
    End Function 'ToString

    Public Property MyProp() As Int32
        Get
            Return myField
        End Get
        Set(ByVal Value As Int32)
            If Value < 1 Then
                Throw New ArgumentOutOfRangeException("value", Value, "value must be > 0")
            End If
            myField = Value
        End Set
    End Property
End Class

Class MyApp

    Shared Sub Main()
        Dim t As Type = GetType(MyType)
        ' Create an instance of a type.
        Dim args() As [Object] = {8}
        Console.WriteLine("The value of x before the constructor is called is {0}.", args(0))
        Dim obj As [Object] = t.InvokeMember(Nothing, BindingFlags.DeclaredOnly Or BindingFlags.Public Or BindingFlags.NonPublic Or BindingFlags.Instance Or BindingFlags.CreateInstance, Nothing, Nothing, args)
        Console.WriteLine("Type: {0}", obj.GetType().ToString())
        Console.WriteLine("The value of x after the constructor returns is {0}.", args(0))

        ' Read and write to a field.
        t.InvokeMember("myField", BindingFlags.DeclaredOnly Or BindingFlags.Public Or BindingFlags.NonPublic Or BindingFlags.Instance Or BindingFlags.SetField, Nothing, obj, New [Object]() {5})
        Dim v As Int32 = CType(t.InvokeMember("myField", BindingFlags.DeclaredOnly Or BindingFlags.Public Or BindingFlags.NonPublic Or BindingFlags.Instance Or BindingFlags.GetField, Nothing, obj, Nothing), Int32)
        Console.WriteLine("myField: {0}", v)

        ' Call a method.
        Dim s As [String] = CType(t.InvokeMember("ToString", BindingFlags.DeclaredOnly Or BindingFlags.Public Or BindingFlags.NonPublic Or BindingFlags.Instance Or BindingFlags.InvokeMethod, Nothing, obj, Nothing), [String])
        Console.WriteLine("ToString: {0}", s)

        ' Read and write a property. First, attempt to assign an
        ' invalid value; then assign a valid value; finally, get
        ' the value.
        Try
            ' Assign the value zero to MyProp. The Property Set 
            ' throws an exception, because zero is an invalid value.
            ' InvokeMember catches the exception, and throws 
            ' TargetInvocationException. To discover the real cause
            ' you must catch TargetInvocationException and examine
            ' the inner exception. 
            t.InvokeMember("MyProp", BindingFlags.DeclaredOnly Or BindingFlags.Public Or BindingFlags.NonPublic Or BindingFlags.Instance Or BindingFlags.SetProperty, Nothing, obj, New [Object]() {0})
        Catch e As TargetInvocationException
            ' If the property assignment failed for some unexpected
            ' reason, rethrow the TargetInvocationException.
            If Not e.InnerException.GetType() Is GetType(ArgumentOutOfRangeException) Then
                Throw
            End If
            Console.WriteLine("An invalid value was assigned to MyProp.")
        End Try
        t.InvokeMember("MyProp", BindingFlags.DeclaredOnly Or BindingFlags.Public Or BindingFlags.NonPublic Or BindingFlags.Instance Or BindingFlags.SetProperty, Nothing, obj, New [Object]() {2})
        v = CType(t.InvokeMember("MyProp", BindingFlags.DeclaredOnly Or BindingFlags.Public Or BindingFlags.NonPublic Or BindingFlags.Instance Or BindingFlags.GetProperty, Nothing, obj, Nothing), Int32)
        Console.WriteLine("MyProp: {0}", v)
    End Sub
End Class

注釈

注意

を使用 InvokeMember してジェネリック メソッドを呼び出すことはできません。

BindingFlags のフィルター フラグを使用して、検索に含めるメンバーを定義できます。

  • 検索にパブリック メンバーを含めるには、 を指定 BindingFlags.Public します。

  • 検索に非パブリック メンバー (つまり、プライベート メンバーと保護されたメンバー) を含める場合に指定 BindingFlags.NonPublic します。

  • 階層の上に静的メンバーを含めるには、 を指定 BindingFlags.FlattenHierarchy します。

検索の動作方法を変更するには、次 BindingFlags の修飾子フラグを使用できます。

  • BindingFlags.IgnoreCase の大文字と小文字を無視する場合 nameは 。

  • BindingFlags.DeclaredOnly で宣言された Typeメンバーのみを検索する場合は 。単に継承されたメンバーは検索されません。

BindingFlags の呼び出しフラグを使用して、メンバーで実行するアクションを示すことができます。

  • CreateInstance コンストラクターを呼び出す場合は 。 name は無視されます。 他の呼び出しフラグでは無効です。

  • InvokeMethod メソッドを呼び出しますが、コンストラクターまたは型初期化子を呼び出す場合は 。 または SetPropertyではSetField無効です。 が単独で指定されている場合InvokeMethodは、、BindingFlags.PublicBindingFlags.Instance、および BindingFlags.Static が自動的に含まれます。

  • GetField を使用してフィールドの値を取得します。 では SetField無効です。

  • SetField フィールドの値を設定します。 では GetField無効です。

  • GetProperty を使用してプロパティを取得します。 では SetProperty無効です。

  • SetProperty を使用してプロパティを設定します。 では GetProperty無効です。

詳細については、「System.Reflection.BindingFlags」を参照してください。

次の両方の条件に該当する場合、メソッドが呼び出されます。

  • メソッド宣言内のパラメーターの数は、配列内の引数の数と等しくなります (メンバーで args 既定の引数が定義され BindingFlags.OptionalParamBinding 、指定されている場合を除く)。

  • 各引数の型は、バインダーによって パラメーターの型に変換できます。

バインダーは、一致するすべてのメソッドを検索します。 これらのメソッドは、要求されたバインディングの種類 (BindingFlagsInvokeMethodGetProperty、など) に基づいて検出されます。 メソッドのセットは、名前、引数の数、およびバインダーで定義されている検索修飾子のセットによってフィルター処理されます。

メソッドが選択されると、呼び出されます。 その時点でアクセシビリティがチェックされます。 検索では、 メソッドに関連付けられているアクセシビリティ属性に基づいて検索するメソッドのセットを制御できます。 クラスの Binder メソッドはBinder.BindToMethod、呼び出されるメソッドを選択する役割を担います。 既定のバインダーは、最も具体的な一致を選択します。

完全に信頼されたコードでは、アクセス制限は無視されます。つまり、プライベート コンストラクター、メソッド、フィールド、およびプロパティは、コードが完全に信頼されるたびに、 を介して System.Reflection アクセスおよび呼び出すことができます。

を使用 Type.InvokeMember すると、 を指定してフィールドを特定の値に BindingFlags.SetField設定できます。 たとえば、クラス C に F という名前のパブリック インスタンス フィールドを設定し、F が である String場合は、次のようなコードを使用できます。

typeof(C).InvokeMember("F", BindingFlags.SetField, null, c, new Object[] {"strings new value"});

F が の場合は、 String[]次のようなコードを使用できます。

typeof(C).InvokeMember("F", BindingFlags.SetField, null, c, new Object[] {new String[]{"a","z","c","d"}});

フィールド F をこの新しい配列に初期化します。 を使用 Type.InvokeMember して、値のインデックスを指定し、次のコードを使用して次の値を指定して配列内の位置を設定することもできます。

typeof(C).InvokeMember("F", BindingFlags.SetField, null, c, new Object[] {1, "b"});

これにより、F が保持する配列の文字列 "z" が文字列 "b" に変更されます。

メンバーを IDispatch 呼び出すときは、文字列形式 "[DispID=##]" を使用して、メンバー名の代わりに DispID を指定できます。 たとえば、MyComMethod の DispID が 3 の場合は、"MyComMethod" ではなく文字列 "[DispID=3]" を指定できます。 DispID でメンバーを呼び出す方が、名前でメンバーを探すよりも高速です。 複雑な集計シナリオでは、DispID が目的のメンバーを呼び出す唯一の方法である場合があります。

注意

.NET Framework 2.0 Service Pack 1 以降では、このメソッドを使用して、フラグを使用して呼び出し元が許可ReflectionPermissionReflectionPermissionFlag.RestrictedMemberAccessされている場合、および非パブリック メンバーの許可セットが呼び出し元の許可セットまたはそのサブセットに制限されている場合は、非パブリック メンバーにアクセスできます。 ( リフレクションのセキュリティに関する考慮事項に関するページを参照してください)。

この機能を使用するには、アプリケーションで .NET Framework 3.5 以降をターゲットにする必要があります。

こちらもご覧ください

適用対象

InvokeMember(String, BindingFlags, Binder, Object, Object[], CultureInfo)

指定したバインディング制約を使用し、指定したメンバーのうち、指定した引数リストおよびカルチャと一致するメンバーを呼び出します。

public:
 System::Object ^ InvokeMember(System::String ^ name, System::Reflection::BindingFlags invokeAttr, System::Reflection::Binder ^ binder, System::Object ^ target, cli::array <System::Object ^> ^ args, System::Globalization::CultureInfo ^ culture);
public:
 virtual System::Object ^ InvokeMember(System::String ^ name, System::Reflection::BindingFlags invokeAttr, System::Reflection::Binder ^ binder, System::Object ^ target, cli::array <System::Object ^> ^ args, System::Globalization::CultureInfo ^ culture);
public object? InvokeMember (string name, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder? binder, object? target, object?[]? args, System.Globalization.CultureInfo? culture);
public object InvokeMember (string name, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder binder, object target, object[] args, System.Globalization.CultureInfo culture);
member this.InvokeMember : string * System.Reflection.BindingFlags * System.Reflection.Binder * obj * obj[] * System.Globalization.CultureInfo -> obj
abstract member InvokeMember : string * System.Reflection.BindingFlags * System.Reflection.Binder * obj * obj[] * System.Globalization.CultureInfo -> obj
override this.InvokeMember : string * System.Reflection.BindingFlags * System.Reflection.Binder * obj * obj[] * System.Globalization.CultureInfo -> obj
Public Function InvokeMember (name As String, invokeAttr As BindingFlags, binder As Binder, target As Object, args As Object(), culture As CultureInfo) As Object

パラメーター

name
String

呼び出すコンストラクター、メソッド、プロパティ、またはフィールド メンバーの名前を格納している文字列。

または

既定メンバーを呼び出すための空の文字列 ("")。

または

IDispatch メンバーの場合は、"[DispID=3]" のように DispID を表す文字列。

invokeAttr
BindingFlags

検索を実施する方法を指定する列挙値のビットごとの組み合わせ。 アクセスは、BindingFlagsPublicNonPublicPrivateInvokeMethod など、GetField のうちの 1 つになります。 検索の種類を指定する必要はありません。 検索の種類が省略されている場合は、BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static を使用します。

binder
Binder

一連のプロパティを定義し、バインディングを有効にするオブジェクト。バインディングには、オーバーロードされたメソッドの選択、引数の型の強制変換、リフレクションによるメンバーの呼び出しなどが含まれます。

または

Nothing を使用する場合は、null 参照 (Visual Basic の場合は DefaultBinder)。 可変個の引数を指定してメソッド オーバーロードを正常に呼び出すには、Binder オブジェクトを明示的に定義することが必要な場合があるのでご注意ください。

target
Object

指定したメンバーを呼び出す対象となるオブジェクト。

args
Object[]

呼び出すメンバーに渡される引数を格納する配列。

culture
CultureInfo

使用するグローバリゼーション ロケールを表すオブジェクト。これは、String 型の数値を Double に変換するなど、ロケール固有の変換を実行するために必要となる場合があります。

または

現在のスレッドの CultureInfo を使用する場合は、null 参照 (Visual Basic の場合は Nothing)。

戻り値

呼び出されるメンバーの戻り値を表すオブジェクト。

実装

例外

invokeAttrCreateInstance が含まれず、namenull です。

invokeAttr が有効な BindingFlags 属性ではありません。

または

invokeAttr にバインド フラグ InvokeMethodCreateInstanceGetFieldSetFieldGetPropertySetPropertyのいずれかが含まれていません。

または

invokeAttr に、 CreateInstanceInvokeMethodGetFieldSetFieldGetPropertySetPropertyとの組み合わせが含まれています。

または

invokeAttrGetFieldSetFieldの両方が含まれています。

または

invokeAttrGetPropertySetPropertyの両方が含まれています。

または

invokeAttr に、 InvokeMethodSetField または SetPropertyとの組み合わせが含まれています。

または

invokeAttrSetField が含まれており、 args に複数の要素があります。

または

COM オブジェクトでこのメソッドが呼び出され、バインド フラグ BindingFlags.InvokeMethodBindingFlags.GetPropertyBindingFlags.SetPropertyBindingFlags.PutDispPropertyBindingFlags.PutRefDispProperty のいずれかが渡されませんでした。

または

名前付きパラメーター配列の 1 つに、 nullである文字列が含まれています。

指定されたメンバーは、クラス初期化子です。

フィールドまたはプロパティが見つかりません。

args 内の引数と一致するメソッドが見つかりません。

または

現在の Type オブジェクトは、オープン型のパラメーターを含む型を表します。つまり、ContainsGenericParameterstrue を返します。

指定されたメンバーを target で呼び出すことができません。

複数のメソッドがバインディングの基準と一致します。

name によって表されるメソッドに、1 つ以上の未指定のジェネリック型パラメーターがあります。 つまり、このメソッドの ContainsGenericParameters プロパティが true を返します。

注釈

既定のバインダーでは (パラメーター) はculture処理CultureInfoされませんが、抽象System.Reflection.Binderクラスを使用して、 を処理cultureするカスタム バインダーを記述できます。

注意

を使用 InvokeMember してジェネリック メソッドを呼び出すことはできません。

BindingFlags のフィルター フラグを使用して、検索に含めるメンバーを定義できます。

  • 検索にパブリック メンバーを含めるには、 を指定 BindingFlags.Public します。

  • 検索に非パブリック メンバー (プライベート、内部、保護されたメンバー) を含める場合に指定 BindingFlags.NonPublic します。

  • 階層の上に静的メンバーを含めるには、 を指定 BindingFlags.FlattenHierarchy します。

検索の動作方法を変更するには、次 BindingFlags の修飾子フラグを使用できます。

  • BindingFlags.IgnoreCase の大文字と小文字を無視する場合 nameは 。

  • BindingFlags.DeclaredOnly で宣言された Typeメンバーのみを検索する場合は 。単に継承されたメンバーは検索されません。

BindingFlags の呼び出しフラグを使用して、メンバーで実行するアクションを示すことができます。

  • CreateInstance コンストラクターを呼び出す場合は 。 name は無視されます。 他の呼び出しフラグでは無効です。

  • InvokeMethod メソッドを呼び出しますが、コンストラクターまたは型初期化子を呼び出す場合は 。 または SetPropertyではSetField無効です。 が単独で指定されている場合InvokeMethodは、、BindingFlags.PublicBindingFlags.Instance、および BindingFlags.Static が自動的に含まれます。

  • GetField を使用してフィールドの値を取得します。 では SetField無効です。

  • SetField フィールドの値を設定します。 では GetField無効です。

  • GetProperty を使用してプロパティを取得します。 では SetProperty無効です。

  • SetProperty を使用してプロパティを設定します。 では GetProperty無効です。

詳細については、「System.Reflection.BindingFlags」を参照してください。

次の両方の条件に該当する場合、メソッドが呼び出されます。

  • メソッド宣言内のパラメーターの数は、配列内の引数の数と等しくなります (メンバーで args 既定の引数が定義され BindingFlags.OptionalParamBinding 、指定されている場合を除く)。

  • 各引数の型は、バインダーによって パラメーターの型に変換できます。

バインダーは、一致するすべてのメソッドを検索します。 これらのメソッドは、要求されたバインディングの種類 (BindingFlagsInvokeMethodGetProperty、など) に基づいて検出されます。 メソッドのセットは、名前、引数の数、およびバインダーで定義されている検索修飾子のセットによってフィルター処理されます。

メソッドが選択されると、呼び出されます。 その時点でアクセシビリティがチェックされます。 検索では、 メソッドに関連付けられているアクセシビリティ属性に基づいて検索するメソッドのセットを制御できます。 クラスの Binder メソッドはBinder.BindToMethod、呼び出されるメソッドを選択する役割を担います。 既定のバインダーは、最も具体的な一致を選択します。

完全に信頼されたコードでは、アクセス制限は無視されます。つまり、プライベート コンストラクター、メソッド、フィールド、およびプロパティは、コードが完全に信頼されるたびに Reflection を介してアクセスおよび呼び出すことができます。

を使用 Type.InvokeMember すると、 を指定してフィールドを特定の値に BindingFlags.SetField設定できます。 たとえば、クラス C に F という名前のパブリック インスタンス フィールドを設定し、F が である String 場合は、次のようなコードを使用できます。

typeof(C).InvokeMember("F", BindingFlags.SetField, null, c, new Object[] {"strings new value"}, null);

F が の場合は、 String[]次のようなコードを使用できます。

typeof(C).InvokeMember("F", BindingFlags.SetField, null, c, new Object[] {new String[]{"a","z","c","d"}}, null);

フィールド F をこの新しい配列に初期化します。 を使用 Type.InvokeMember して、値のインデックスを指定し、次のコードを使用して次の値を指定して配列内の位置を設定することもできます。

typeof(C).InvokeMember("F", BindingFlags.SetField, null, c, new Object[] {1, "b"}, null);

これにより、F が保持する配列の文字列 "z" が文字列 "b" に変更されます。

メンバーを IDispatch 呼び出すときは、文字列形式 "[DispID=##]" を使用して、メンバー名の代わりに DispID を指定できます。 たとえば、MyComMethod の DispID が 3 の場合は、"MyComMethod" ではなく文字列 "[DispID=3]" を指定できます。 DispID でメンバーを呼び出す方が、名前でメンバーを探すよりも高速です。 複雑な集計シナリオでは、DispID が目的のメンバーを呼び出す唯一の方法である場合があります。

注意

.NET Framework 2.0 Service Pack 1 以降では、このメソッドを使用して、呼び出し元に フラグが付与ReflectionPermissionReflectionPermissionFlag.RestrictedMemberAccessされている場合、および非パブリック メンバーの許可セットが呼び出し元の許可セットまたはそのサブセットに制限されている場合は、非パブリック メンバーにアクセスできます。 ( リフレクションのセキュリティに関する考慮事項に関するページを参照してください)。

この機能を使用するには、アプリケーションで .NET Framework 3.5 以降をターゲットにする必要があります。

こちらもご覧ください

適用対象

InvokeMember(String, BindingFlags, Binder, Object, Object[], ParameterModifier[], CultureInfo, String[])

派生クラス内でオーバーライドされた場合、指定したバインディング制約を使用し、指定した引数リスト、修飾子、カルチャと照合して、指定されたメンバーを呼び出します。

public:
 abstract System::Object ^ InvokeMember(System::String ^ name, System::Reflection::BindingFlags invokeAttr, System::Reflection::Binder ^ binder, System::Object ^ target, cli::array <System::Object ^> ^ args, cli::array <System::Reflection::ParameterModifier> ^ modifiers, System::Globalization::CultureInfo ^ culture, cli::array <System::String ^> ^ namedParameters);
public abstract object? InvokeMember (string name, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder? binder, object? target, object?[]? args, System.Reflection.ParameterModifier[]? modifiers, System.Globalization.CultureInfo? culture, string[]? namedParameters);
public abstract object InvokeMember (string name, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder binder, object target, object[] args, System.Reflection.ParameterModifier[] modifiers, System.Globalization.CultureInfo culture, string[] namedParameters);
abstract member InvokeMember : string * System.Reflection.BindingFlags * System.Reflection.Binder * obj * obj[] * System.Reflection.ParameterModifier[] * System.Globalization.CultureInfo * string[] -> obj
Public MustOverride Function InvokeMember (name As String, invokeAttr As BindingFlags, binder As Binder, target As Object, args As Object(), modifiers As ParameterModifier(), culture As CultureInfo, namedParameters As String()) As Object

パラメーター

name
String

呼び出すコンストラクター、メソッド、プロパティ、またはフィールド メンバーの名前を格納している文字列。

または

既定メンバーを呼び出すための空の文字列 ("")。

または

IDispatch メンバーの場合は、"[DispID=3]" のように DispID を表す文字列。

invokeAttr
BindingFlags

検索を実施する方法を指定する列挙値のビットごとの組み合わせ。 アクセスは、BindingFlagsPublicNonPublicPrivateInvokeMethod など、GetField のうちの 1 つになります。 検索の種類を指定する必要はありません。 検索の種類が省略されている場合は、BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static を使用します。

binder
Binder

一連のプロパティを定義し、バインディングを有効にするオブジェクト。バインディングには、オーバーロードされたメソッドの選択、引数の型の強制変換、リフレクションによるメンバーの呼び出しなどが含まれます。

または

DefaultBinder を使用する場合は、null 参照 (Visual Basic の場合は Nothing)。 可変個の引数を指定してメソッド オーバーロードを正常に呼び出すには、Binder オブジェクトを明示的に定義することが必要な場合があるのでご注意ください。

target
Object

指定したメンバーを呼び出す対象となるオブジェクト。

args
Object[]

呼び出すメンバーに渡される引数を格納する配列。

modifiers
ParameterModifier[]

args 配列内の対応する要素に関連付けられている属性を表す ParameterModifier オブジェクトの配列。 パラメーターに関連付けられた属性は、メンバーのシグネチャに格納されます。

既定のバインダーは、COM コンポーネントを呼び出す場合のみ、このパラメーターを処理します。

culture
CultureInfo

使用するロケールを表す CultureInfo オブジェクト。これは、String 型の数値を Double に変換するなど、ロケール固有の変換を実行するために必要となる場合があります。

または

現在のスレッドの CultureInfo を使用する場合は、null 参照 (Visual Basic の場合は Nothing)。

namedParameters
String[]

args 配列内の値が渡されるパラメーターの名前を格納する配列。

戻り値

呼び出されるメンバーの戻り値を表すオブジェクト。

実装

例外

invokeAttrCreateInstance が含まれず、namenull です。

argsmodifiers の長さが同じではありません。

または

invokeAttr が有効な BindingFlags 属性ではありません。

または

invokeAttr にバインド フラグ InvokeMethodCreateInstanceGetFieldSetFieldGetPropertySetPropertyのいずれかが含まれていません。

または

invokeAttr に、 CreateInstanceInvokeMethodGetFieldSetFieldGetPropertySetPropertyとの組み合わせが含まれています。

または

invokeAttrGetFieldSetFieldの両方が含まれています。

または

invokeAttrGetPropertySetPropertyの両方が含まれています。

または

invokeAttr に、 InvokeMethodSetField または SetPropertyとの組み合わせが含まれています。

または

invokeAttrSetField が含まれており、 args に複数の要素があります。

または

名前付きパラメーター配列が、引数配列よりも長くなっています。

または

COM オブジェクトでこのメソッドが呼び出され、バインド フラグ BindingFlags.InvokeMethodBindingFlags.GetPropertyBindingFlags.SetPropertyBindingFlags.PutDispPropertyBindingFlags.PutRefDispProperty のいずれかが渡されませんでした。

または

名前付きパラメーター配列の 1 つに、 nullである文字列が含まれています。

指定されたメンバーは、クラス初期化子です。

フィールドまたはプロパティが見つかりません。

args 内の引数と一致するメソッドが見つかりません。

または

namedParameters の中で引数名が指定されているメンバーが見つかりません。

または

現在の Type オブジェクトは、オープン型のパラメーターを含む型を表します。つまり、ContainsGenericParameterstrue を返します。

指定されたメンバーを target で呼び出すことができません。

複数のメソッドがバインディングの基準と一致します。

name によって表されるメソッドに、1 つ以上の未指定のジェネリック型パラメーターがあります。 つまり、このメソッドの ContainsGenericParameters プロパティが true を返します。

注釈

InvokeMember は、コンストラクター メンバーまたはメソッド メンバーの呼び出し、プロパティ メンバーの取得または設定、データ フィールド メンバーの取得または設定、配列メンバーの要素の取得または設定を行います。

注意

を使用 InvokeMember してジェネリック メソッドを呼び出すことはできません。

メンバーを IDispatch 呼び出すときは、文字列形式 "[DispID=##]" を使用して、メンバー名の代わりに DispID を指定できます。 たとえば、MyComMethod の DispID が 3 の場合は、"MyComMethod" ではなく文字列 "[DispID=3]" を指定できます。 DispID によるメンバーの呼び出しは、メンバーを名前で調べることよりも高速です。 複雑な集計シナリオでは、DispID が目的のメンバーを呼び出す唯一の方法である場合があります。

既定のバインダーでは または (および パラメーター) は処理ParameterModifierされませんが、抽象System.Reflection.Binderクラスを使用して、 と cultureを処理modifiersするカスタム バインダーを記述できます。culturemodifiersCultureInfo ParameterModifier は COM 相互運用機能を介して を呼び出すときにのみ使用され、参照によって渡されるパラメーターのみが処理されます。

namedParameters 配列の各パラメーターは、args 配列内の対応する要素の値を取得します。 args の長さが namedParameters の長さより大きい場合、残りの引数の値は順番に渡されます。

配列を namedParameters 使用して、入力配列内の引数の順序を変更できます。 たとえば、 メソッド M(string a, int b) (M(ByVal a As String, ByVal b As Integer)Visual Basic の場合) と入力配列{ 42, "x" }を指定すると、配列が に指定されているnamedParameters場合、入力配列{ "b", "a" }を に変更せずにargs渡すことができます。

BindingFlags のフィルター フラグを使用して、検索に含めるメンバーを定義できます。

  • 検索にパブリック メンバーを含めるには、 を指定 BindingFlags.Public します。

  • 非パブリック メンバー (つまり、プライベート、内部、および保護されたメンバー) を検索に含めるには、 を指定 BindingFlags.NonPublic します。

  • 階層の上に静的メンバーを含めるには、 を指定 BindingFlags.FlattenHierarchy します。

検索のしくみを変更するには、次 BindingFlags の修飾子フラグを使用できます。

  • BindingFlags.IgnoreCase の大文字と小文字を無視する場合 nameは 。

  • BindingFlags.DeclaredOnly で宣言された Typeメンバーのみを検索する場合は 。単に継承されたメンバーは検索されません。

BindingFlags の呼び出しフラグを使用して、メンバーで実行するアクションを示すことができます。

  • CreateInstance コンストラクターを呼び出す場合は 。 name は無視されます。 他の呼び出しフラグでは無効です。

  • InvokeMethod メソッドを呼び出すが、コンストラクターや型初期化子を呼び出す場合は 。 または SetPropertyではSetField無効です。 がそれ自体で指定されている場合InvokeMethodは、 BindingFlags.StaticBindingFlags.PublicBindingFlags.Instanceが自動的に含まれます。

  • GetField フィールドの値を取得する場合は 。 では SetField無効です。

  • SetField フィールドの値を設定する場合は 。 では GetField無効です。

  • GetProperty プロパティを取得する場合は 。 では SetProperty無効です。

  • SetProperty プロパティを設定する場合は 。 では GetProperty無効です。

詳細については、「System.Reflection.BindingFlags」を参照してください。

次の条件が両方とも当てはまる場合は、メソッドが呼び出されます。

  • メソッド宣言のパラメーターの数は、配列内の引数の数と等しくなります (既定の引数 args がメンバーで定義され BindingFlags.OptionalParamBinding 、指定されていない限り)。

  • 各引数の型は、バインダーによって パラメーターの型に変換できます。

バインダーは、一致するすべてのメソッドを検索します。 これらのメソッドは、要求されたバインディングの種類 (BindingFlagsInvokeMethodGetProperty、など) に基づいて見つかります。 メソッドのセットは、名前、引数の数、およびバインダーで定義されている検索修飾子のセットによってフィルター処理されます。

メソッドが選択されると、呼び出されます。 その時点でアクセシビリティがチェックされます。 検索では、 メソッドに関連付けられているアクセシビリティ属性に基づいて、検索するメソッドのセットを制御できます。 クラスの Binder メソッドはBinder.BindToMethod、呼び出されるメソッドを選択します。 既定のバインダーは、最も具体的な一致を選択します。

InvokeMember を使用して、既定値を持つパラメーターを使用してメソッドを呼び出すことができます。 これらのメソッドにバインドするには、Reflection を指定する必要 BindingFlags.OptionalParamBinding があります。 既定値を持つパラメーターの場合は、別の値を指定するか、 を指定 Missing.Value して既定値を使用できます。

たとえば、MyMethod(int x, float y = 2.0) などのメソッドを考えてみましょう。 MyMethod(4) として最初の引数のみを指定してこのメソッドを呼び出すには、上記のいずれかのバインド フラグを渡し、2 つの引数 (つまり、最初の引数に 4、2 番目の引数 Missing.Value に 4) を渡します。 を使用 Missing.Valueしない限り、 メソッドで省略可能なパラメーターを Invoke 省略することはできません。 これを行う必要がある場合は、代わりに を使用 InvokeMember します。

アクセス制限は、完全に信頼されたコードでは無視されます。つまり、プライベート コンストラクター、メソッド、フィールド、およびプロパティは、コードが完全に信頼されている場合は常に を介して System.Reflection アクセスおよび呼び出すことができます。

を使用 Type.InvokeMember すると、 を指定してフィールドを特定の値に BindingFlags.SetField設定できます。 たとえば、クラス C に F という名前のパブリック インスタンス フィールドを設定し、F が である String場合は、次のようなコードを使用できます。

typeof(C).InvokeMember("F", BindingFlags.SetField, null, c, new Object[] {"strings new value"}, null, null, null);

F が の場合は、 String[]次のようなコードを使用できます。

typeof(C).InvokeMember("F", BindingFlags.SetField, null, c, new Object[] {new String[]{"a","z","c","d"}}, null, null, null);

フィールド F をこの新しい配列に初期化します。 を使用 Type.InvokeMember して、値のインデックスを指定し、次のコードを使用して次の値を指定することで、配列内の位置を設定することもできます。

typeof(C).InvokeMember("F", BindingFlags.SetField, null, c, new Object[] {1, "b"}, null, null, null);

これにより、F が保持する配列の文字列 "z" が文字列 "b" に変更されます。

注意

.NET Framework 2.0 Service Pack 1 以降では、このメソッドを使用して、呼び出し元に フラグが付与ReflectionPermissionReflectionPermissionFlag.RestrictedMemberAccessされている場合、および非パブリック メンバーの許可セットが呼び出し元の許可セットまたはそのサブセットに制限されている場合は、非パブリック メンバーにアクセスできます。 ( リフレクションのセキュリティに関する考慮事項に関するページを参照してください)。

この機能を使用するには、アプリケーションで .NET Framework 3.5 以降をターゲットにする必要があります。

こちらもご覧ください

適用対象