Type.InvokeMember メソッド (String, BindingFlags, Binder, Object, Object[], ParameterModifier[], CultureInfo, String )
派生クラスによってオーバーライドされた場合、指定したバインディング制約を使用し、指定したメンバのうち、指定した引数リスト、修飾子、およびカルチャと一致するメンバを呼び出します。
Overloads Public MustOverride Function InvokeMember( _
ByVal name As String, _ ByVal invokeAttr As BindingFlags, _ ByVal binder As Binder, _ ByVal target As Object, _ ByVal args() As Object, _ ByVal modifiers() As ParameterModifier, _ ByVal culture As CultureInfo, _ ByVal namedParameters() As String _) As Object Implements IReflect.InvokeMember
[C#]
public abstract object InvokeMember(stringname,BindingFlagsinvokeAttr,Binderbinder,objecttarget,object[] args,ParameterModifier[] modifiers,CultureInfoculture,string[] namedParameters);
[C++]
public: virtual Object* InvokeMember(String* name,BindingFlagsinvokeAttr,Binder* binder,Object* target,Object* args __gc[],ParameterModifiermodifiers[],CultureInfo* culture,String* namedParameters __gc[]) = 0;
[JScript]
public abstract function InvokeMember(
name : String,invokeAttr : BindingFlags,binder : Binder,target : Object,args : Object[],modifiers : ParameterModifier[],culture : CultureInfo,namedParameters : String[]) : Object;
パラメータ
name
呼び出すコンストラクタ、メソッド、プロパティ、またはフィールド メンバの名前を格納している String 。または
既定メンバを呼び出すための空の文字列 ("")。
invokeAttr
検索の実行方法を指定する 1 つ以上の BindingFlags から成るビット マスク。アクセスは、Public、 NonPublic 、Private、 InvokeMethod 、 GetField など、 BindingFlags のうちの 1 つになります。検索の種類を指定する必要はありません。検索の種類を省略した場合は、 BindingFlags.Public | BindingFlags.Instance が適用されます。binder
一連のプロパティを定義し、バインディングを有効にする Binder オブジェクト。バインディングには、オーバーロードされたメソッドの選択、引数の型の強制変換、リフレクションによるメンバの呼び出しなどが含まれます。または
DefaultBinder を使用する場合は null 参照 (Visual Basic では Nothing) 。
target
指定したメンバの呼び出し元となる Object 。args
呼び出すメンバに渡される引数を格納する配列。modifiers
args 配列内の対応する要素に関連付けられた属性を表す ParameterModifier オブジェクトの配列。パラメータに関連付けられた属性は、メンバのシグネチャに格納されます。既定のバインダは、このパラメータを処理しません。culture
使用するロケールを表す CultureInfo オブジェクト。これは、String 型の数値を Double に変換するなど、ロケール固有の変換を実行するために必要となる場合があります。または
現在のスレッドの CultureInfo を使用する場合は null 参照 (Visual Basic では Nothing) 。
namedParameters
args 配列内の値が渡されるパラメータの名前を格納する配列。
戻り値
呼び出されたメンバの戻り値を表す Object 。
実装
例外
例外の種類 | 条件 |
---|---|
ArgumentNullException | invokeAttr に CreateInstance が格納されていて、 typeName が null 参照 (Visual Basic では Nothing) です。 |
ArgumentException | args が多次元です。
または modifiers が多次元です。 または args と modifiers の長さが異なります。 または invokeAttr が有効な BindingFlags 属性ではありません。 または invokeAttr に、 InvokeMethod 、 GetField 、 SetField 、 GetProperty 、または SetProperty と組み合わされた CreateInstance が格納されています。 または invokeAttr に、 GetField と SetField が格納されています。 または invokeAttr に、 GetProperty と SetProperty が格納されています。 または invokeAttr に、 SetField または SetProperty と組み合わされた InvokeMethod が格納されています。 または invokeAttr に SetField が格納されていて、 args に複数の要素があります。 または この名前付きパラメータ配列は、引数配列よりも大きくなります。 または このメソッドは COM オブジェクトに対して呼び出され、バインディング フラグ BindingFlags.InvokeMethod 、 BindingFlags.GetProperty 、 BindingFlags.SetProperty 、 BindingFlags.PutDispProperty 、または BindingFlags.PutRefDispProperty が渡されませんでした。 または 名前付きパラメータ配列の 1 つには、 null 参照 (Visual Basic では Nothing) の文字列が含まれています。 |
MethodAccessException | 指定されたメンバがクラス初期化子です。 |
MissingFieldException | フィールドまたはプロパティが見つかりません。 |
MissingMethodException | メソッドが見つかりません。 |
TargetException | 指定されたメンバを target で呼び出すことができません。 |
AmbiguousMatchException | 複数のメソッドがバインディング基準に一致します。 |
解説
InvokeMember は、コンストラクタのメンバまたはメソッドのメンバの呼び出し、プロパティのメンバの取得または設定、データ フィールドのメンバの取得または設定、または配列のメンバの要素の取得または設定を行います。
既定のバインダは ParameterModifier または CultureInfo (modifiers パラメータおよび culture パラメータ) を処理しませんが、 System.Reflection.Binder 抽象クラスを使用して、 modifiers と culture を処理するカスタム バインダを記述できます。 ParameterModifier は、COM 相互運用機能によって呼び出すときだけに使用され、参照渡しされるパラメータだけが処理されます。
args 配列と modifiers 配列の長さが同じです。 args 配列で指定するパラメータには、 modifiers 配列で指定されている pdIn、pdOut、pdLcid、pdRetval、pdOptional、pdHasDefault の各属性を設定できます。これらの属性は、それぞれ [In]、[Out]、[lcid]、[retval]、[optional]、およびパラメータが既定値を持つかどうかを指定する値を表します。パラメータに関連付けられた属性はメタデータに格納され、相互運用性を拡張します。
namedParameters 配列内の各パラメータは、 args 配列内の対応する要素の値を取得します。 args の長さが namedParameters の長さを超える場合は、残った引数の値が順に渡されます。
次の BindingFlags フィルタ フラグは、検索対象に含めるメンバを定義するために使用できます。
- 戻り値を取得するには、 BindingFlags.Instance または BindingFlags.Static のいずれかを指定する必要があります。
- 検索対象にパブリック メンバを含めるための BindingFlags.Public を指定します。
- 検索対象にパブリックではないメンバ (つまり、プライベート メンバやプロテクト メンバ) を含めるための BindingFlags.NonPublic を指定します。
- 階層構造の上位にある静的メンバを含めるための BindingFlags.FlattenHierarchy を指定します。
次の BindingFlags 修飾フラグは、検索方法を変更するために使用できます。
- name の大文字と小文字の違いを無視する場合は BindingFlags.IgnoreCase 。
- 単に継承されただけのメンバではなく、 Type で宣言されたメンバだけを検索する場合は BindingFlags.DeclaredOnly 。
次の BindingFlags 呼び出しフラグは、メンバを使用して実行するアクションを指定するために使用できます。
- コンストラクタを呼び出すための CreateInstance 。name は無視されます。他の呼び出しフラグの場合は無効です。
- メソッドを呼び出すための InvokeMethod 。ただし、コンストラクタや型初期化子は呼び出しません。 SetField または SetProperty の場合は無効です。
- フィールドの値を取得するための GetField 。 SetField の場合は無効です。
- フィールドの値を設定するための SetField 。 GetField の場合は無効です。
- プロパティを取得するための GetProperty 。 SetProperty の場合は無効です。
- プロパティを設定するための SetProperty 。 GetProperty の場合は無効です。
詳細については、「 System.Reflection.BindingFlags 」を参照してください。
次の条件が true の場合は、メソッドが呼び出されます。
- メソッド宣言のパラメータの数が、 args 配列に格納されている引数の数と等しい (メンバに既定の引数が定義されている場合を除く)。
- バインダによって各引数の型をパラメータの型に変換できること。
バインダは一致するすべてのメソッドを検索します。これらのメソッドは、要求されるバインディングの種類に基づいて検索されます (BindingFlags 値 InvokeMethod 、 GetProperty など)。メソッド セットは、名前、引数の数、バインダで定義されている一連の検索修飾子によってフィルタ処理されます。
メソッドは、選択された後に呼び出されます。その時点で、アクセスできるかどうかが確認されます。検索では、メソッドに関連付けられているアクセシビリティ属性に基づいて、どのメソッド セットを検索するかを制御できます。 Binder クラスの Binder.BindToMethod メソッドは、呼び出すメソッドを選択します。既定のバインダは最も的確に一致したものを選択します。
パラメータの既定値が設定されたメソッドを呼び出すには、 InvokeMember を使用します。これらのメソッドをバインドするには、リフレクションでは BindingFlags.OptionalParamBinding を指定することが必要です。既定値を持つパラメータに対しては、別の値を指定するか、または Missing.Value を提供して既定値を使用できます。
たとえば、MyMethod(int x, float y = 2.0) というメソッドがあるとします。このメソッドを MyMethod(4) のように最初の引数だけを指定して呼び出すには、上記のバインディング フラグのうち 1 つを渡し、最初の引数には 4、第 2 の引数には Missing.Value という 2 つの引数を渡します。Invoke メソッドでは、 Missing.Value を使用する場合を除いて、オプションのパラメータを省略することはできません。オプションのパラメータを省略する必要のある場合は、代わりに InvokeMember を使用してください。
完全に信頼されているコードに対しては、アクセス制限は無視されます。つまり、コードが完全に信頼されている場合は、 System.Reflection を使用して、プライベートなコンストラクタ、メソッド、フィールド、およびプロパティにアクセスしたり、それらを呼び出すことができます。
BindingFlags.SetField を指定することによって、 Type.InvokeMember を使用してフィールドに特定の値を設定できます。たとえば、F という名前のパブリック インスタンス フィールドにクラス C を設定する場合、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" に変更されます。
必要条件
プラットフォーム: 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 セキュリティ:
- ReflectionPermission (非パブリック メンバをリフレクション操作するために必要なアクセス許可) ReflectionPermissionFlag.MemberAccess (関連する列挙体)
- SecurityPermission (アンマネージ コードを呼び出すために必要なアクセス許可) SecurityPermissionFlag.UnmanagedCode (関連する列挙体)
参照
Type クラス | Type メンバ | System 名前空間 | Type.InvokeMember オーバーロードの一覧 | String | Binder | DefaultBinder | BindingFlags | ParameterModifier | ParameterAttributes | CultureInfo | ReflectionPermission