Type.InvokeMember 方法
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
叫用目前 Type 的特定成員。
多載
InvokeMember(String, BindingFlags, Binder, Object, Object[]) |
使用指定的繫結條件約束並符合指定的引數清單,來叫用指定的成員。 |
InvokeMember(String, BindingFlags, Binder, Object, Object[], CultureInfo) |
使用指定的繫結條件約束並符合指定的引數清單和文化特性 (Culture) 來叫用指定的成員。 |
InvokeMember(String, BindingFlags, Binder, Object, Object[], ParameterModifier[], CultureInfo, String[]) |
在衍生類別中覆寫時,使用指定的繫結條件約束並符合指定的引數清單、修飾詞和文化特性,來叫用指定的成員。 |
InvokeMember(String, BindingFlags, Binder, Object, Object[])
- 來源:
- Type.cs
- 來源:
- Type.cs
- 來源:
- Type.cs
使用指定的繫結條件約束並符合指定的引數清單,來叫用指定的成員。
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 的字串,例如 "[DispID=3]"。
- invokeAttr
- BindingFlags
列舉值的位元組合,用來指定搜尋的執行方式。 該存取可以是其中一個 BindingFlags
,例如 Public
、NonPublic
、Private
、InvokeMethod
、GetField
等等。 不需要指定查閱的類型。 如果省略查閱的類型,則會使用 BindingFlags.Public
| BindingFlags.Instance
| BindingFlags.Static
。
- binder
- Binder
定義一組屬性並啟用繫結的物件,可包含多載方法的選擇、引數類型的強制,以及透過反映的成員引動過程。
-或-
Null 參考 (在 Visual Basic 中為Nothing
),可使用 DefaultBinder。 請注意,可能需要明確定義 Binder 物件,才能順利以變數引數叫用方法多載。
- target
- Object
要在其上叫用指定成員的物件。
- args
- Object[]
包含引數的陣列,這些引數會傳遞給要叫用的成員。
傳回
表示叫用的成員之傳回值的物件。
實作
例外狀況
invokeAttr
不包含 CreateInstance
,而且 name
為 null
。
invokeAttr
不是有效的 BindingFlags 屬性。
-或-
invokeAttr
不包含下列其中一個繫結旗標: InvokeMethod
、 CreateInstance
、 GetField
、 SetField
、 GetProperty
或 SetProperty
。
-或-
invokeAttr
包含與 CreateInstance
、 InvokeMethod
、 GetField
、 SetField
或 GetProperty
合併的 SetProperty
。
-或-
invokeAttr
同時包含 GetField
和 SetField
。
-或-
invokeAttr
同時包含 GetProperty
和 SetProperty
。
-或-
invokeAttr
包含與 InvokeMethod
或 SetField
合併的 SetProperty
。
-或-
invokeAttr
包含 SetField
且 args
具有一個以上的項目。
-或-
已在 COM 物件上呼叫此方法且下列其中一個繫結旗標未傳入:BindingFlags.InvokeMethod
、BindingFlags.GetProperty
、BindingFlags.SetProperty
、BindingFlags.PutDispProperty
或 BindingFlags.PutRefDispProperty
。
-或-
其中一個具名參數陣列包含的字串是 null
。
指定的成員是類別初始設定式。
找不到欄位或屬性。
無法在 target
上叫用指定的成員。
有一個以上符合繫結準則的方法。
.NET Compact Framework 目前不支援這個方法。
name
所表示的方法有一或多個未指定的泛型類型參數。 亦即,方法的 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
表示叫用方法,但不是建構函式或型別初始化表達式。 與SetField
或SetProperty
無效。 如果InvokeMethod
是由自己指定,BindingFlags.Public
則會自動包含、BindingFlags.Instance
和BindingFlags.Static
。GetField
表示取得欄位的值。 無效。SetField
SetField
表示設定欄位的值。 無效。GetField
GetProperty
以取得屬性。 無效。SetProperty
SetProperty
表示設定屬性。 無效。GetProperty
如需相關資訊,請參閱 System.Reflection.BindingFlags 。
如果下列兩個條件成立,則會叫用 方法:
方法宣告中的參數數目等於陣列中的
args
自變數數目 (除非在成員上定義預設自變數,而且BindingFlags.OptionalParamBinding
指定) 。每個自變數的類型都可以由系結器轉換成參數的類型。
系結器會尋找所有相符的方法。 這些方法是根據所要求的系結類型, (BindingFlags 值 InvokeMethod
、 GetProperty
等等) 。 方法集合會依名稱、自變數數目,以及系結器中定義的一組搜尋修飾詞進行篩選。
選取方法之後,就會叫用此方法。 此時會檢查輔助功能。 搜尋可能會根據與 方法相關聯的輔助功能屬性來控制搜尋哪一組方法。 類別 Binder.BindToMethod 的 Binder 方法負責選取要叫用的方法。 默認系結器會選取最特定的相符專案。
完全信任的程式代碼會忽略存取限制;也就是說,只要完全信任程序代碼,就可以透過 System.Reflection 存取和叫用私用建構函式、方法、欄位和屬性。
您可以藉由指定 BindingFlags.SetField,使用 Type.InvokeMember
將欄位設定為特定值。 例如,如果您想要在類別 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,您可以指定字串 “[DispID=3]”,而不是 “MyComMethod”。 依 DispID 叫用成員的速度比依名稱查閱成員更快。 在複雜的匯總案例中,DispID 有時是叫用所需成員的唯一方法。
注意
從 .NET Framework 2.0 Service Pack 1 開始,如果呼叫端已使用 旗標授ReflectionPermissionReflectionPermissionFlag.RestrictedMemberAccess與呼叫端,以及非公用成員的授與集限制為呼叫端的授與集,或其中子集,則這個方法可用來存取非公用成員。 (請參閱 反映的安全性考慮。)
若要使用這項功能,您的應用程式應該以 .NET Framework 3.5 或更新版本為目標。
另請參閱
- String
- Binder
- DefaultBinder
- BindingFlags
- ParameterModifier
- ParameterAttributes
- CultureInfo
- ReflectionPermission
適用於
InvokeMember(String, BindingFlags, Binder, Object, Object[], CultureInfo)
- 來源:
- Type.cs
- 來源:
- Type.cs
- 來源:
- Type.cs
使用指定的繫結條件約束並符合指定的引數清單和文化特性 (Culture) 來叫用指定的成員。
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 的字串,例如 "[DispID=3]"。
- invokeAttr
- BindingFlags
列舉值的位元組合,用來指定搜尋的執行方式。 該存取可以是其中一個 BindingFlags
,例如 Public
、NonPublic
、Private
、InvokeMethod
、GetField
等等。 不需要指定查閱的類型。 如果省略查閱的類型,則會使用 BindingFlags.Public
| BindingFlags.Instance
| BindingFlags.Static
。
- binder
- Binder
定義一組屬性並啟用繫結的物件,可包含多載方法的選擇、引數類型的強制,以及透過反映的成員引動過程。
-或-
Null 參考 (在 Visual Basic 中為Nothing
),可使用 DefaultBinder。 請注意,可能需要明確定義 Binder 物件,才能順利以變數引數叫用方法多載。
- target
- Object
要在其上叫用指定成員的物件。
- args
- Object[]
包含引數的陣列,這些引數會傳遞給要叫用的成員。
- culture
- CultureInfo
表示要使用之全球化地區設定的物件,它可能是地區設定特性轉換所需要的,例如將數值 String 轉換成 Double。
-或-
Null 參考 (Visual Basic 中的Nothing
),可使用目前執行緒的 CultureInfo。
傳回
表示叫用的成員之傳回值的物件。
實作
例外狀況
invokeAttr
不包含 CreateInstance
,而且 name
為 null
。
invokeAttr
不是有效的 BindingFlags 屬性。
-或-
invokeAttr
不包含下列其中一個繫結旗標: InvokeMethod
、 CreateInstance
、 GetField
、 SetField
、 GetProperty
或 SetProperty
。
-或-
invokeAttr
包含與 CreateInstance
、 InvokeMethod
、 GetField
、 SetField
或 GetProperty
合併的 SetProperty
。
-或-
invokeAttr
同時包含 GetField
和 SetField
。
-或-
invokeAttr
同時包含 GetProperty
和 SetProperty
。
-或-
invokeAttr
包含與 InvokeMethod
或 SetField
合併的 SetProperty
。
-或-
invokeAttr
包含 SetField
且 args
具有一個以上的項目。
-或-
已在 COM 物件上呼叫此方法且下列其中一個繫結旗標未傳入:BindingFlags.InvokeMethod
、BindingFlags.GetProperty
、BindingFlags.SetProperty
、BindingFlags.PutDispProperty
或 BindingFlags.PutRefDispProperty
。
-或-
其中一個具名參數陣列包含的字串是 null
。
指定的成員是類別初始設定式。
找不到欄位或屬性。
無法在 target
上叫用指定的成員。
有一個以上符合繫結準則的方法。
name
所表示的方法有一或多個未指定的泛型類型參數。 亦即,方法的 ContainsGenericParameters 屬性傳回 true
。
備註
雖然預設系結器不會處理 CultureInfo 參數 (culture
) ,但您可以使用抽象 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.Public
則會自動包含、BindingFlags.Instance
和BindingFlags.Static
。GetField
取得欄位的值。 無效。SetField
SetField
表示設定欄位的值。 無效。GetField
GetProperty
取得屬性。 無效。SetProperty
SetProperty
表示設定屬性。 無效。GetProperty
如需相關資訊,請參閱 System.Reflection.BindingFlags 。
如果下列兩個條件都成立,將會叫用方法:
方法宣告中的參數數目等於數位中的
args
自變數數目 (,除非在成員上定義預設自變數,而且BindingFlags.OptionalParamBinding
指定) 。系結器可以將每個自變數的類型轉換成 參數的類型。
系結器會尋找所有相符的方法。 這些方法會根據要求 BindingFlags (值 InvokeMethod
、 GetProperty
、 等的系結類型來找到) 。 方法集會依名稱、自變數數目和系結器中定義的一組搜尋修飾詞進行篩選。
選取方法之後,就會叫用此方法。 此時會檢查輔助功能。 搜尋可能會根據與 方法相關聯的輔助功能屬性來控制搜尋哪一組方法。 類別 Binder.BindToMethod 的 Binder 方法負責選取要叫用的方法。 默認系結器會選取最特定的相符專案。
完全信任的程式代碼會忽略存取限制;也就是說,每當程式代碼完全信任時,都可以透過反映來存取和叫用私人建構函式、方法、字段和屬性。
您可以藉由指定 BindingFlags.SetField,使用 Type.InvokeMember
將欄位設定為特定值。 例如,如果您想要在類別 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,您可以指定字串 “[DispID=3]”,而不是 “MyComMethod”。 依 DispID 叫用成員的速度比依名稱查閱成員更快。 在複雜的匯總案例中,DispID 有時是叫用所需成員的唯一方式。
注意
從 .NET Framework 2.0 Service Pack 1 開始,如果呼叫端已使用 旗標授ReflectionPermissionReflectionPermissionFlag.RestrictedMemberAccess與呼叫端,而且非公用成員的授與集限制為呼叫端的授與集,或是子集,則這個方法可用來存取非公用成員。 (請參閱 反映的安全性考慮。)
若要使用這項功能,您的應用程式應該以 .NET Framework 3.5 或更新版本為目標。
另請參閱
- String
- Binder
- DefaultBinder
- BindingFlags
- ParameterModifier
- ParameterAttributes
- CultureInfo
- ReflectionPermission
適用於
InvokeMember(String, BindingFlags, Binder, Object, Object[], ParameterModifier[], CultureInfo, String[])
- 來源:
- Type.cs
- 來源:
- Type.cs
- 來源:
- Type.cs
在衍生類別中覆寫時,使用指定的繫結條件約束並符合指定的引數清單、修飾詞和文化特性,來叫用指定的成員。
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 的字串,例如 "[DispID=3]"。
- invokeAttr
- BindingFlags
列舉值的位元組合,用來指定搜尋的執行方式。 該存取可以是其中一個 BindingFlags
,例如 Public
、NonPublic
、Private
、InvokeMethod
、GetField
等等。 不需要指定查閱的類型。 如果省略查閱的類型,則會使用 BindingFlags.Public
| BindingFlags.Instance
| BindingFlags.Static
。
- binder
- Binder
定義一組屬性並啟用繫結的物件,可包含多載方法的選擇、引數類型的強制,以及透過反映的成員引動過程。
-或-
Null 參考 (在 Visual Basic 中為 Nothing),可使用 DefaultBinder。 請注意,可能需要明確定義 Binder 物件,才能順利以變數引數叫用方法多載。
- target
- Object
要在其上叫用指定成員的物件。
- args
- Object[]
包含引數的陣列,這些引數會傳遞給要叫用的成員。
- modifiers
- ParameterModifier[]
ParameterModifier 物件的陣列,代表在 args
陣列中與對應項目關聯的屬性。 參數的關聯屬性儲存在成員的簽章中。
預設繫結器只會在呼叫 COM 元件時處理這個參數。
- culture
- CultureInfo
CultureInfo 物件,代表要使用的全球化地區設定,進行特定地區設定轉換時可能需要這個物件,例如將數值的 String 轉換成 Double。
-或-
Null 參考 (Visual Basic 中的Nothing
),可使用目前執行緒的 CultureInfo。
- namedParameters
- String[]
陣列,包含 args
陣列中的值所要傳遞之目標參數的名稱。
傳回
表示叫用的成員之傳回值的物件。
實作
例外狀況
invokeAttr
不包含 CreateInstance
,而且 name
為 null
。
args
和 modifiers
的長度不同。
-或-
invokeAttr
不是有效的 BindingFlags 屬性。
-或-
invokeAttr
不包含下列其中一個繫結旗標: InvokeMethod
、 CreateInstance
、 GetField
、 SetField
、 GetProperty
或 SetProperty
。
-或-
invokeAttr
包含與 CreateInstance
、 InvokeMethod
、 GetField
、 SetField
或 GetProperty
合併的 SetProperty
。
-或-
invokeAttr
同時包含 GetField
和 SetField
。
-或-
invokeAttr
同時包含 GetProperty
和 SetProperty
。
-或-
invokeAttr
包含與 InvokeMethod
或 SetField
合併的 SetProperty
。
-或-
invokeAttr
包含 SetField
且 args
具有一個以上的項目。
-或-
具名參數陣列大於引數陣列。
-或-
已在 COM 物件上呼叫此方法且下列其中一個繫結旗標未傳入:BindingFlags.InvokeMethod
、BindingFlags.GetProperty
、BindingFlags.SetProperty
、BindingFlags.PutDispProperty
或 BindingFlags.PutRefDispProperty
。
-或-
其中一個具名參數陣列包含的字串是 null
。
指定的成員是類別初始設定式。
找不到欄位或屬性。
找不到符合 args
中之引數的方法。
-或-
找不到具有 namedParameters
中所提供引數名稱的成員。
-或-
目前的 Type 物件代表包含開啟類型參數的類型,亦即,ContainsGenericParameters 傳回 true
。
無法在 target
上叫用指定的成員。
有一個以上符合繫結準則的方法。
name
所表示的方法有一或多個未指定的泛型類型參數。 亦即,方法的 ContainsGenericParameters 屬性傳回 true
。
備註
InvokeMember
會呼叫建構函式成員或方法成員、取得或設定屬性成員、取得或設定數據欄位成員,或取得或設定陣列成員的專案。
注意
您無法使用 叫用 InvokeMember 泛型方法。
當您叫 IDispatch
用成員時,您可以使用字串格式 “[DispID=##]”來指定 DispID,而不是成員名稱。 例如,如果 MyComMethod 的 DispID 為 3,您可以指定字串 “[DispID=3]”,而不是 “MyComMethod”。 依 DispID 叫用成員的速度比依名稱查閱成員更快。 在複雜的匯總案例中,DispID 有時是叫用所需成員的唯一方式。
雖然預設系結器不會處理ParameterModifier或 CultureInfo (和 參數) modifiers
,但您可以使用抽象System.Reflection.Binder類來撰寫會處理 modifiers
和 culture
culture
的自定義系結器。
ParameterModifier
只有在透過 COM Interop 呼叫時,才會使用,而且只會處理以傳址方式傳遞的參數。
namedParameters
陣列中的每個參數會在 args
陣列中取得對應項目的值。 如果 args
的長度大於 namedParameters
的長度,則會依序傳遞其餘引數值。
陣列 namedParameters
可用來變更輸入陣列中的自變數順序。 例如,假設在 Visual Basic) 和輸入數位{ 42, "x" }
中 (M(ByVal a As String, ByVal b As Integer)
方法M(string a, int b)
,如果 提供 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.Public
則會自動包含、BindingFlags.Instance
和BindingFlags.Static
。GetField
取得欄位的值。 無效。SetField
SetField
表示設定欄位的值。 無效。GetField
GetProperty
取得屬性。 無效。SetProperty
SetProperty
表示設定屬性。 無效。GetProperty
如需相關資訊,請參閱 System.Reflection.BindingFlags 。
如果下列兩個條件都成立,將會叫用方法:
方法宣告中的參數數目等於數位中的
args
自變數數目 (,除非在成員上定義預設自變數,而且BindingFlags.OptionalParamBinding
指定) 。系結器可以將每個自變數的類型轉換成 參數的類型。
系結器會尋找所有相符的方法。 這些方法是根據所要求的系結類型, (BindingFlags 值 InvokeMethod
、 GetProperty
等等) 。 方法集合會依名稱、自變數數目,以及系結器中定義的一組搜尋修飾詞進行篩選。
選取方法之後,就會叫用此方法。 此時會檢查輔助功能。 搜尋可能會根據與 方法相關聯的輔助功能屬性來控制搜尋哪一組方法。 類別 Binder.BindToMethod 的 Binder 方法負責選取要叫用的方法。 默認系結器會選取最特定的相符專案。
InvokeMember
可用來叫用具有預設值之參數的方法。 若要系結至這些方法,必須指定 Reflection BindingFlags.OptionalParamBinding 。 對於具有預設值的參數,您可以提供不同的值,或提供 Missing.Value 來使用預設值。
例如,假設有一種方法,例如 MyMethod (int x、float y = 2.0) 。 若要只叫用第一個自變數作為 MyMethod (4) 的這個方法,請傳遞上述其中一個系結旗標,並傳遞兩個自變數,也就是 4 代表第一個自變數和第 Missing.Value
二個自變數。 除非您使用 Missing.Value
,否則可能不會省略選擇性參數與 Invoke
方法。 如果您必須這麼做,請改用 InvokeMember
。
完全信任的程式代碼會忽略存取限制;也就是說,只要完全信任程序代碼,就可以透過 System.Reflection 存取和叫用私用建構函式、方法、欄位和屬性。
您可以藉由指定 BindingFlags.SetField,使用 Type.InvokeMember
將欄位設定為特定值。 例如,如果您想要在類別 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 或更新版本為目標。
另請參閱
- String
- Binder
- DefaultBinder
- BindingFlags
- ParameterModifier
- ParameterAttributes
- CultureInfo
- ReflectionPermission