Type.InvokeMember メソッド (String, BindingFlags, Binder, Object, Object )
指定したバインディング制約を使用し、指定した引数リストと照合して、指定したメンバを呼び出します。
Overloads Public Function InvokeMember( _
ByVal name As String, _ ByVal invokeAttr As BindingFlags, _ ByVal binder As Binder, _ ByVal target As Object, _ ByVal args() As Object _) As Object
[C#]
public object InvokeMember(stringname,BindingFlagsinvokeAttr,Binderbinder,objecttarget,object[] args);
[C++]
public: Object* InvokeMember(String* name,BindingFlagsinvokeAttr,Binder* binder,Object* target,Object* args __gc[]);
[JScript]
public function InvokeMember(
name : String,invokeAttr : BindingFlags,binder : Binder,target : Object,args : Object[]) : 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
呼び出すメンバに渡される引数を格納する配列。
戻り値
呼び出されたメンバの戻り値を表す Object 。
例外
例外の種類 | 条件 |
---|---|
ArgumentNullException | invokeAttr に CreateInstance が格納されていて、 typeName が null 参照 (Visual Basic では Nothing) です。 |
ArgumentException | args が多次元です。
または 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 | 複数のメソッドがバインディング基準に一致します。 |
解説
次の 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 メソッドは、呼び出すメソッドを選択します。既定のバインダは最も的確に一致したものを選択します。
完全に信頼されているコードに対しては、アクセス制限は無視されます。つまり、コードが完全に信頼されている場合は、 System.Reflection を使用して、プライベートなコンストラクタ、メソッド、フィールド、およびプロパティにアクセスしたり、それらを呼び出すことができます。
BindingFlags.SetField を指定することによって、 Type.InvokeMember を使用してフィールドに特定の値を設定できます。たとえば、F という名前のパブリック インスタンス フィールドにクラス C を設定する場合、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" に変更されます。
使用例
[Visual Basic, C#, C++] InvokeMember を使用して型のメンバにアクセスする例を次に示します。
Imports System
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 'New
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 'MyType
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 'Main
End Class 'MyApp
[C#]
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);
}
}
[C++]
#using <mscorlib.dll>
using namespace System;
using namespace System::Reflection;
// This sample class has a field, constructor, method, and property.
__gc class MyType
{
Int32 myField;
public:
MyType(Int32 __gc * x)
{
*x *= 5;
}
String* ToString()
{
return myField.ToString();
}
__property Int32 get_MyProp()
{
return myField;
}
__property void set_MyProp( Int32 value)
{
if (value < 1)
throw new ArgumentOutOfRangeException(S"value", __box(value), S"value must be > 0");
myField = value;
}
};
int main()
{
Type* t = __typeof(MyType);
// Create an instance of a type.
Object* args[] = {__box(8)};
Console::WriteLine(S"The value of x before the constructor is called is {0}.", args[0]);
Object* obj = t->InvokeMember(0,
static_cast<BindingFlags>(BindingFlags::DeclaredOnly | BindingFlags::Public | BindingFlags::NonPublic |
BindingFlags::Instance | BindingFlags::CreateInstance), 0, 0, args);
Console::WriteLine(S"Type: {0}", obj->GetType());
Console::WriteLine(S"The value of x after the constructor returns is {0}.", args[0]);
// Read and write to a field.
Object* obj5[] = {__box(5)};
t->InvokeMember(S"myField",
static_cast<BindingFlags>(BindingFlags::DeclaredOnly |
BindingFlags::Public | BindingFlags::NonPublic |
BindingFlags::Instance | BindingFlags::SetField), 0, obj, obj5);
Int32 v = *__try_cast<Int32 __gc *>( t->InvokeMember(S"myField",
static_cast<BindingFlags>(BindingFlags::DeclaredOnly |
BindingFlags::Public | BindingFlags::NonPublic |
BindingFlags::Instance | BindingFlags::GetField), 0, obj, 0) );
Console::WriteLine(S"myField: {0}", __box(v));
// Call a method.
String* s = __try_cast<String*>( t->InvokeMember(S"ToString",
static_cast<BindingFlags>(BindingFlags::DeclaredOnly |
BindingFlags::Public | BindingFlags::NonPublic |
BindingFlags::Instance | BindingFlags::InvokeMethod), 0, obj, 0) );
Console::WriteLine(S"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.
Object* obj0[] = {__box(0)};
t->InvokeMember(S"MyProp",
static_cast<BindingFlags>(BindingFlags::DeclaredOnly |
BindingFlags::Public | BindingFlags::NonPublic |
BindingFlags::Instance | BindingFlags::SetProperty), 0, obj, obj0);
} catch (TargetInvocationException* e) {
// If the property assignment failed for some unexpected
// reason, rethrow the TargetInvocationException.
if (e->InnerException->GetType() !=
__typeof(ArgumentOutOfRangeException))
throw;
Console::WriteLine(S"An invalid value was assigned to MyProp.");
}
Object* obj2[] = {__box(2)};
t->InvokeMember(S"MyProp",
static_cast<BindingFlags>(BindingFlags::DeclaredOnly |
BindingFlags::Public | BindingFlags::NonPublic |
BindingFlags::Instance | BindingFlags::SetProperty), 0, obj, obj2);
v = *__try_cast<Int32 __gc *>( t->InvokeMember(S"MyProp",
static_cast<BindingFlags>(BindingFlags::DeclaredOnly |
BindingFlags::Public | BindingFlags::NonPublic |
BindingFlags::Instance | BindingFlags::GetProperty), 0, obj, 0) );
Console::WriteLine(S"MyProp: {0}", __box(v));
}
[JScript] JScript のサンプルはありません。Visual Basic、C#、および C++ のサンプルを表示するには、このページの左上隅にある言語のフィルタ ボタン をクリックします。
必要条件
プラットフォーム: 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