Type.InvokeMember Método
Definición
Importante
Parte de la información hace referencia a la versión preliminar del producto, que puede haberse modificado sustancialmente antes de lanzar la versión definitiva. Microsoft no otorga ninguna garantía, explícita o implícita, con respecto a la información proporcionada aquí.
Invoca a un miembro específico del objeto Type actual.
Sobrecargas
InvokeMember(String, BindingFlags, Binder, Object, Object[]) |
Invoca al miembro especificado, aplica las restricciones de enlace igualmente especificadas y compara la lista de argumentos indicada. |
InvokeMember(String, BindingFlags, Binder, Object, Object[], CultureInfo) |
Invoca al miembro especificado, aplica las restricciones de enlace especificadas y compara la lista de argumentos y la referencia cultural igualmente especificadas. |
InvokeMember(String, BindingFlags, Binder, Object, Object[], ParameterModifier[], CultureInfo, String[]) |
Cuando se invalida en una clase derivada, invoca al miembro especificado, aplica las restricciones de enlace igualmente especificadas y realiza una comparación con la lista de argumentos, los modificadores y la referencia cultural indicados. |
InvokeMember(String, BindingFlags, Binder, Object, Object[])
- Source:
- Type.cs
- Source:
- Type.cs
- Source:
- Type.cs
Invoca al miembro especificado, aplica las restricciones de enlace igualmente especificadas y compara la lista de argumentos indicada.
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
Parámetros
- name
- String
Cadena que contiene el nombre del constructor, el método, la propiedad o el miembro de campo al que se va a invocar.
O bien
Cadena vacía ("") para llamar al miembro predeterminado.
O bien
Para los miembros de IDispatch
, cadena que representa el identificador DispID, por ejemplo "[DispID=3]".
- invokeAttr
- BindingFlags
Combinación bit a bit de los valores de enumeración que especifican cómo se realiza la búsqueda. El acceso puede corresponder a uno de los marcadores BindingFlags
, como Public
, NonPublic
, Private
, InvokeMethod
, GetField
, etc. No es necesario especificar el tipo de búsqueda. Si se omite el tipo de búsqueda, se usan BindingFlags.Public
| BindingFlags.Instance
| BindingFlags.Static
.
- binder
- Binder
Objeto que define un conjunto de propiedades y permite realizar operaciones de enlace, que pueden incluir la selección de un método sobrecargado, la coerción de tipos de argumentos y la invocación de un miembro mediante reflexión.
O bien
Referencia nula (Nothing
en Visual Basic) para usar la propiedad DefaultBinder. Observe que la definición explícita de un objeto Binder puede resultar necesaria para llamar correctamente a sobrecargas de método con argumentos variables.
- target
- Object
Objeto donde debe invocarse al miembro especificado.
- args
- Object[]
Matriz que contiene los argumentos que se van a pasar al miembro al cual se va a invocar.
Devoluciones
Objeto que representa el valor devuelto del miembro invocado.
Implementaciones
Excepciones
invokeAttr
no contiene CreateInstance
y name
es null
.
invokeAttr
no es un atributo BindingFlags válido.
O bien
invokeAttr
no contiene una de las siguientes marcas de enlace: InvokeMethod
, CreateInstance
, GetField
, SetField
, GetProperty
o SetProperty
.
O bien
invokeAttr
contiene CreateInstance
combinado con InvokeMethod
, GetField
, SetField
, GetProperty
o SetProperty
.
O bien
invokeAttr
contiene tanto GetField
como SetField
.
O bien
invokeAttr
contiene tanto GetProperty
como SetProperty
.
O bien
invokeAttr
contiene InvokeMethod
combinado con SetField
o SetProperty
.
O bien
invokeAttr
contiene SetField
y args
tiene más de un elemento.
O bien
Se llama a este método en un objeto COM pero no se pasa una de las siguientes marcas de enlace: BindingFlags.InvokeMethod
, BindingFlags.GetProperty
, BindingFlags.SetProperty
, BindingFlags.PutDispProperty
o BindingFlags.PutRefDispProperty
.
O bien
Una de las matrices de parámetros con nombre contiene una cadena que es null
.
El miembro especificado es un inicializador de clase.
No se encuentran el campo o la propiedad.
No se encuentra ningún método que coincida con los argumentos en args
.
O bien
El objeto Type actual representa un tipo que contiene parámetros de tipo abierto, es decir, ContainsGenericParameters devuelve true
.
No se puede invocar al miembro especificado en target
.
Más de un método coincide con los criterios de enlace.
.NET Compact Framework no admite actualmente este método.
El método representado por name
tiene uno o más parámetros de tipo genérico no especificados. Es decir, la propiedad ContainsGenericParameters del método devuelve true
.
Ejemplos
En el ejemplo siguiente se usa InvokeMember
para tener acceso a los miembros de un tipo.
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
Comentarios
Nota
No se puede usar InvokeMember para invocar un método genérico.
Las marcas de filtro siguientes BindingFlags se pueden usar para definir qué miembros se van a incluir en la búsqueda:
Especifique
BindingFlags.Public
para incluir miembros públicos en la búsqueda.Especifique
BindingFlags.NonPublic
para incluir miembros no públicos (es decir, miembros privados y protegidos) en la búsqueda.Especifique
BindingFlags.FlattenHierarchy
para incluir miembros estáticos en la jerarquía.
Se pueden usar las marcas modificadores siguientes BindingFlags para cambiar el funcionamiento de la búsqueda:
BindingFlags.IgnoreCase
para pasar por alto el caso dename
.BindingFlags.DeclaredOnly
para buscar solo los miembros declarados en Type, no los miembros que simplemente se heredaron.
Las marcas de invocación siguientes BindingFlags se pueden usar para indicar qué acción realizar con el miembro:
CreateInstance
para invocar un constructor.name
se pasa por alto. No es válido con otras marcas de invocación.InvokeMethod
para invocar un método, pero no un constructor o un inicializador de tipo. No es válido conSetField
oSetProperty
. SiInvokeMethod
se especifica por sí mismo, ,BindingFlags.Public
BindingFlags.Instance
yBindingFlags.Static
se incluyen automáticamente.GetField
para obtener el valor de un campo. No es válido conSetField
.SetField
para establecer el valor de un campo. No es válido conGetField
.GetProperty
para obtener una propiedad. No es válido conSetProperty
.SetProperty
para establecer una propiedad. No es válido conGetProperty
.
Vea System.Reflection.BindingFlags para obtener más información.
Se invocará un método si se cumplen las dos condiciones siguientes:
El número de parámetros de la declaración de método es igual al número de argumentos de la
args
matriz (a menos que se definan argumentos predeterminados en el miembro yBindingFlags.OptionalParamBinding
se especifique).El enlazador puede convertir el tipo de cada argumento en el tipo del parámetro .
El enlazador encontrará todos los métodos coincidentes. Estos métodos se encuentran en función del tipo de enlace solicitado (BindingFlags valores InvokeMethod
, GetProperty
, etc.). El conjunto de métodos se filtra por el nombre, el número de argumentos y un conjunto de modificadores de búsqueda definidos en el enlazador.
Una vez seleccionado el método, se invoca. La accesibilidad se comprueba en ese momento. La búsqueda puede controlar qué conjunto de métodos se buscan en función del atributo de accesibilidad asociado al método . El Binder.BindToMethod método de la Binder clase es responsable de seleccionar el método que se va a invocar. El enlazador predeterminado selecciona la coincidencia más específica.
Las restricciones de acceso se omiten para el código de plena confianza; es decir, se puede tener acceso a constructores privados, métodos, campos y propiedades e invocarse a través System.Reflection de cada vez que el código sea de plena confianza.
Puede usar Type.InvokeMember
para establecer un campo en un valor determinado especificando BindingFlags.SetField. Por ejemplo, si desea establecer un campo de instancia pública denominado F en la clase C y F es un String
, puede usar código como:
typeof(C).InvokeMember("F", BindingFlags.SetField, null, c, new Object[] {"strings new value"});
Si F es , String[]
puede usar código como:
typeof(C).InvokeMember("F", BindingFlags.SetField, null, c, new Object[] {new String[]{"a","z","c","d"}});
que inicializará el campo F en esta nueva matriz. También puede usar Type.InvokeMember
para establecer una posición en una matriz proporcionando el índice del valor y, a continuación, el siguiente mediante código como el siguiente:
typeof(C).InvokeMember("F", BindingFlags.SetField, null, c, new Object[] {1, "b"});
Esto cambiará la cadena "z" de la matriz que F contiene a la cadena "b".
Al invocar un IDispatch
miembro, puede especificar el DispID en lugar del nombre del miembro, con el formato de cadena "[DispID=##]". Por ejemplo, si el DispID de MyComMethod es 3, puede especificar la cadena "[DispID=3]" en lugar de "MyComMethod". Invocar un miembro por DispID es más rápido que buscar el miembro por nombre. En escenarios de agregación complejos, dispID a veces es la única manera de invocar el miembro deseado.
Nota
A partir de .NET Framework 2.0 Service Pack 1, este método se puede usar para acceder a miembros no públicos si se ha concedido ReflectionPermission al autor de la llamada con la ReflectionPermissionFlag.RestrictedMemberAccess marca y si el conjunto de concesión de los miembros no públicos está restringido al conjunto de concesión del autor de la llamada o a un subconjunto de ellos. (Consulte Consideraciones de seguridad para la reflexión).
Para usar esta funcionalidad, la aplicación debe tener como destino .NET Framework 3.5 o posterior.
Consulte también
- String
- Binder
- DefaultBinder
- BindingFlags
- ParameterModifier
- ParameterAttributes
- CultureInfo
- ReflectionPermission
Se aplica a
InvokeMember(String, BindingFlags, Binder, Object, Object[], CultureInfo)
- Source:
- Type.cs
- Source:
- Type.cs
- Source:
- Type.cs
Invoca al miembro especificado, aplica las restricciones de enlace especificadas y compara la lista de argumentos y la referencia cultural igualmente especificadas.
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
Parámetros
- name
- String
Cadena que contiene el nombre del constructor, el método, la propiedad o el miembro de campo al que se va a invocar.
O bien
Cadena vacía ("") para llamar al miembro predeterminado.
O bien
Para los miembros de IDispatch
, cadena que representa el identificador DispID, por ejemplo "[DispID=3]".
- invokeAttr
- BindingFlags
Combinación bit a bit de los valores de enumeración que especifican cómo se realiza la búsqueda. El acceso puede corresponder a uno de los marcadores BindingFlags
, como Public
, NonPublic
, Private
, InvokeMethod
, GetField
, etc. No es necesario especificar el tipo de búsqueda. Si se omite el tipo de búsqueda, se usan BindingFlags.Public
| BindingFlags.Instance
| BindingFlags.Static
.
- binder
- Binder
Objeto que define un conjunto de propiedades y permite realizar operaciones de enlace, que pueden incluir la selección de un método sobrecargado, la coerción de tipos de argumentos y la invocación de un miembro mediante reflexión.
O bien
Referencia nula (Nothing
en Visual Basic) para usar la propiedad DefaultBinder. Observe que la definición explícita de un objeto Binder puede resultar necesaria para llamar correctamente a sobrecargas de método con argumentos variables.
- target
- Object
Objeto donde debe invocarse al miembro especificado.
- args
- Object[]
Matriz que contiene los argumentos que se van a pasar al miembro al cual se va a invocar.
- culture
- CultureInfo
Objeto que representa la configuración regional de globalización que se va a usar, que puede ser necesaria para las conversiones específicas de la configuración regional, como pasar un tipo numérico String a Double.
O bien
Referencia nula (Nothing
en Visual Basic) para usar el CultureInfo del subproceso actual.
Devoluciones
Objeto que representa el valor devuelto del miembro invocado.
Implementaciones
Excepciones
invokeAttr
no contiene CreateInstance
y name
es null
.
invokeAttr
no es un atributo BindingFlags válido.
O bien
invokeAttr
no contiene una de las siguientes marcas de enlace: InvokeMethod
, CreateInstance
, GetField
, SetField
, GetProperty
o SetProperty
.
O bien
invokeAttr
contiene CreateInstance
combinado con InvokeMethod
, GetField
, SetField
, GetProperty
o SetProperty
.
O bien
invokeAttr
contiene tanto GetField
como SetField
.
O bien
invokeAttr
contiene tanto GetProperty
como SetProperty
.
O bien
invokeAttr
contiene InvokeMethod
combinado con SetField
o SetProperty
.
O bien
invokeAttr
contiene SetField
y args
tiene más de un elemento.
O bien
Se llama a este método en un objeto COM pero no se pasa una de las siguientes marcas de enlace: BindingFlags.InvokeMethod
, BindingFlags.GetProperty
, BindingFlags.SetProperty
, BindingFlags.PutDispProperty
o BindingFlags.PutRefDispProperty
.
O bien
Una de las matrices de parámetros con nombre contiene una cadena que es null
.
El miembro especificado es un inicializador de clase.
No se encuentran el campo o la propiedad.
No se encuentra ningún método que coincida con los argumentos en args
.
O bien
El objeto Type actual representa un tipo que contiene parámetros de tipo abierto, es decir, ContainsGenericParameters devuelve true
.
No se puede invocar al miembro especificado en target
.
Más de un método coincide con los criterios de enlace.
El método representado por name
tiene uno o más parámetros de tipo genérico no especificados. Es decir, la propiedad ContainsGenericParameters del método devuelve true
.
Comentarios
Aunque el enlazador predeterminado no procesa CultureInfo (el culture
parámetro ), puede usar la clase abstracta System.Reflection.Binder para escribir un enlazador personalizado que procesa culture
.
Nota
No se puede usar InvokeMember para invocar un método genérico.
Las marcas de filtro siguientes BindingFlags se pueden usar para definir qué miembros se van a incluir en la búsqueda:
Especifique
BindingFlags.Public
para incluir miembros públicos en la búsqueda.Especifique
BindingFlags.NonPublic
que incluya miembros no públicos (es decir, miembros privados, internos y protegidos) en la búsqueda.Especifique
BindingFlags.FlattenHierarchy
para incluir miembros estáticos en la jerarquía.
Se pueden usar las marcas modificadores siguientes BindingFlags para cambiar el funcionamiento de la búsqueda:
BindingFlags.IgnoreCase
para pasar por alto el caso dename
.BindingFlags.DeclaredOnly
para buscar solo los miembros declarados en Type, no los miembros que simplemente se heredaron.
Las marcas de invocación siguientes BindingFlags se pueden usar para indicar qué acción realizar con el miembro:
CreateInstance
para invocar un constructor.name
se pasa por alto. No es válido con otras marcas de invocación.InvokeMethod
para invocar un método, pero no un constructor o un inicializador de tipo. No es válido conSetField
oSetProperty
. SiInvokeMethod
se especifica por sí mismo, ,BindingFlags.Public
BindingFlags.Instance
yBindingFlags.Static
se incluyen automáticamente.GetField
para obtener el valor de un campo. No es válido conSetField
.SetField
para establecer el valor de un campo. No es válido conGetField
.GetProperty
para obtener una propiedad. No es válido conSetProperty
.SetProperty
para establecer una propiedad. No es válido conGetProperty
.
Vea System.Reflection.BindingFlags para obtener más información.
Se invocará un método si se cumplen las dos condiciones siguientes:
El número de parámetros de la declaración de método es igual al número de argumentos de la
args
matriz (a menos que se definan argumentos predeterminados en el miembro yBindingFlags.OptionalParamBinding
se especifique).El enlazador puede convertir el tipo de cada argumento en el tipo del parámetro .
El enlazador encontrará todos los métodos coincidentes. Estos métodos se encuentran en función del tipo de enlace solicitado (BindingFlags valores InvokeMethod
, GetProperty
, etc.). El conjunto de métodos se filtra por el nombre, el número de argumentos y un conjunto de modificadores de búsqueda definidos en el enlazador.
Una vez seleccionado el método, se invoca. La accesibilidad se comprueba en ese momento. La búsqueda puede controlar qué conjunto de métodos se buscan en función del atributo de accesibilidad asociado al método . El Binder.BindToMethod método de la Binder clase es responsable de seleccionar el método que se va a invocar. El enlazador predeterminado selecciona la coincidencia más específica.
Las restricciones de acceso se omiten para el código de plena confianza; es decir, se puede tener acceso a constructores privados, métodos, campos y propiedades e invocarse a través de Reflexión siempre que el código sea de plena confianza.
Puede usar Type.InvokeMember
para establecer un campo en un valor determinado especificando BindingFlags.SetField. Por ejemplo, si desea establecer un campo de instancia pública denominado F en la clase C, y F es un String
código como:
typeof(C).InvokeMember("F", BindingFlags.SetField, null, c, new Object[] {"strings new value"}, null);
Si F es , String[]
puede usar código como:
typeof(C).InvokeMember("F", BindingFlags.SetField, null, c, new Object[] {new String[]{"a","z","c","d"}}, null);
que inicializará el campo F en esta nueva matriz. También puede usar Type.InvokeMember
para establecer una posición en una matriz proporcionando el índice del valor y, a continuación, el siguiente mediante código como el siguiente:
typeof(C).InvokeMember("F", BindingFlags.SetField, null, c, new Object[] {1, "b"}, null);
Esto cambiará la cadena "z" de la matriz que F contiene a la cadena "b".
Al invocar un IDispatch
miembro, puede especificar el DispID en lugar del nombre del miembro, con el formato de cadena "[DispID=##]". Por ejemplo, si el DispID de MyComMethod es 3, puede especificar la cadena "[DispID=3]" en lugar de "MyComMethod". Invocar un miembro por DispID es más rápido que buscar el miembro por nombre. En escenarios de agregación complejos, dispID a veces es la única manera de invocar el miembro deseado.
Nota
A partir de .NET Framework 2.0 Service Pack 1, este método se puede usar para acceder a miembros no públicos si se ha concedido ReflectionPermission al autor de la llamada con la ReflectionPermissionFlag.RestrictedMemberAccess marca y si el conjunto de concesión de los miembros no públicos está restringido al conjunto de concesión del autor de la llamada o a un subconjunto de ellos. (Consulte Consideraciones de seguridad para la reflexión).
Para usar esta funcionalidad, la aplicación debe tener como destino .NET Framework 3.5 o posterior.
Consulte también
- String
- Binder
- DefaultBinder
- BindingFlags
- ParameterModifier
- ParameterAttributes
- CultureInfo
- ReflectionPermission
Se aplica a
InvokeMember(String, BindingFlags, Binder, Object, Object[], ParameterModifier[], CultureInfo, String[])
- Source:
- Type.cs
- Source:
- Type.cs
- Source:
- Type.cs
Cuando se invalida en una clase derivada, invoca al miembro especificado, aplica las restricciones de enlace igualmente especificadas y realiza una comparación con la lista de argumentos, los modificadores y la referencia cultural indicados.
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
Parámetros
- name
- String
Cadena que contiene el nombre del constructor, el método, la propiedad o el miembro de campo al que se va a invocar.
O bien
Cadena vacía ("") para llamar al miembro predeterminado.
O bien
Para los miembros de IDispatch
, cadena que representa el identificador DispID, por ejemplo "[DispID=3]".
- invokeAttr
- BindingFlags
Combinación bit a bit de los valores de enumeración que especifican cómo se realiza la búsqueda. El acceso puede corresponder a uno de los marcadores BindingFlags
, como Public
, NonPublic
, Private
, InvokeMethod
, GetField
, etc. No es necesario especificar el tipo de búsqueda. Si se omite el tipo de búsqueda, se usan BindingFlags.Public
| BindingFlags.Instance
| BindingFlags.Static
.
- binder
- Binder
Objeto que define un conjunto de propiedades y permite realizar operaciones de enlace, que pueden incluir la selección de un método sobrecargado, la coerción de tipos de argumentos y la invocación de un miembro mediante reflexión.
O bien
Referencia nula (Nothing en Visual Basic) para usar la propiedad DefaultBinder. Observe que la definición explícita de un objeto Binder puede resultar necesaria para llamar correctamente a sobrecargas de método con argumentos variables.
- target
- Object
Objeto donde debe invocarse al miembro especificado.
- args
- Object[]
Matriz que contiene los argumentos que se van a pasar al miembro al cual se va a invocar.
- modifiers
- ParameterModifier[]
Matriz de objetos ParameterModifier que representan los atributos asociados al elemento correspondiente de la matriz args
. Los atributos asociados a un parámetro se almacenan en la firma del miembro.
El enlazador predeterminado solo procesa este parámetro cuando se llama a un componente COM.
- culture
- CultureInfo
Objeto CultureInfo que representa la configuración regional de globalización que se va a usar, que puede ser necesaria para las conversiones específicas de la configuración regional, como pasar un tipo numérico String a Double.
O bien
Referencia nula (Nothing
en Visual Basic) para usar el CultureInfo del subproceso actual.
- namedParameters
- String[]
Matriz que contiene los nombres de los parámetros a los que se pasan los valores de la matriz args
.
Devoluciones
Objeto que representa el valor devuelto del miembro invocado.
Implementaciones
Excepciones
invokeAttr
no contiene CreateInstance
y name
es null
.
args
y modifiers
no tienen la misma longitud.
O bien
invokeAttr
no es un atributo BindingFlags válido.
O bien
invokeAttr
no contiene una de las siguientes marcas de enlace: InvokeMethod
, CreateInstance
, GetField
, SetField
, GetProperty
o SetProperty
.
O bien
invokeAttr
contiene CreateInstance
combinado con InvokeMethod
, GetField
, SetField
, GetProperty
o SetProperty
.
O bien
invokeAttr
contiene tanto GetField
como SetField
.
O bien
invokeAttr
contiene tanto GetProperty
como SetProperty
.
O bien
invokeAttr
contiene InvokeMethod
combinado con SetField
o SetProperty
.
O bien
invokeAttr
contiene SetField
y args
tiene más de un elemento.
O bien
La matriz de parámetros con nombre es mayor que la matriz de argumentos.
O bien
Se llama a este método en un objeto COM pero no se pasa una de las siguientes marcas de enlace: BindingFlags.InvokeMethod
, BindingFlags.GetProperty
, BindingFlags.SetProperty
, BindingFlags.PutDispProperty
o BindingFlags.PutRefDispProperty
.
O bien
Una de las matrices de parámetros con nombre contiene una cadena que es null
.
El miembro especificado es un inicializador de clase.
No se encuentran el campo o la propiedad.
No se encuentra ningún método que coincida con los argumentos en args
.
O bien
No se puede encontrar ningún miembro con los nombres de argumento proporcionados en namedParameters
.
O bien
El objeto Type actual representa un tipo que contiene parámetros de tipo abierto, es decir, ContainsGenericParameters devuelve true
.
No se puede invocar al miembro especificado en target
.
Más de un método coincide con los criterios de enlace.
El método representado por name
tiene uno o más parámetros de tipo genérico no especificados. Es decir, la propiedad ContainsGenericParameters del método devuelve true
.
Comentarios
InvokeMember
llama a un miembro del constructor o a un miembro de método, obtiene o establece un miembro de propiedad, obtiene o establece un miembro de campo de datos, u obtiene o establece un elemento de un miembro de matriz.
Nota
No se puede usar InvokeMember para invocar un método genérico.
Al invocar a un IDispatch
miembro, puede especificar dispID en lugar del nombre del miembro con el formato de cadena "[DispID=##]". Por ejemplo, si el DispID de MyComMethod es 3, puede especificar la cadena "[DispID=3]" en lugar de "MyComMethod". Invocar un miembro por DispID es más rápido que buscar el miembro por nombre. En escenarios de agregación complejos, dispID a veces es la única manera de invocar el miembro deseado.
Aunque el enlazador predeterminado no procesa ParameterModifier o (los modifiers
parámetros yculture
), puede usar la clase abstracta System.Reflection.Binder para escribir un enlazador personalizado que procesa modifiers
y culture
CultureInfo .
ParameterModifier
solo se usa al llamar a través de la interoperabilidad COM y solo se controlan los parámetros que se pasan por referencia.
Cada parámetro de la matriz namedParameters
obtiene el valor del elemento correspondiente en la matriz args
. Si la longitud de args
es mayor que la longitud de namedParameters
, los valores de argumento restantes se pasan por orden.
La namedParameters
matriz se puede usar para cambiar el orden de los argumentos en una matriz de entrada. Por ejemplo, dado el método M(string a, int b)
(M(ByVal a As String, ByVal b As Integer)
en Visual Basic) y la matriz { 42, "x" }
de entrada , la matriz de entrada se puede pasar sin cambios a args
si la matriz { "b", "a" }
se proporciona para namedParameters
.
Las marcas de filtro siguientes BindingFlags se pueden usar para definir qué miembros se van a incluir en la búsqueda:
Especifique
BindingFlags.Public
para incluir miembros públicos en la búsqueda.Especifique
BindingFlags.NonPublic
que incluya miembros no públicos (es decir, miembros privados, internos y protegidos) en la búsqueda.Especifique
BindingFlags.FlattenHierarchy
para incluir miembros estáticos en la jerarquía.
Se pueden usar las marcas modificadores siguientes BindingFlags para cambiar el funcionamiento de la búsqueda:
BindingFlags.IgnoreCase
para pasar por alto el caso dename
.BindingFlags.DeclaredOnly
para buscar solo los miembros declarados en Type, no los miembros que simplemente se heredaron.
Las siguientes BindingFlags marcas de invocación se pueden usar para indicar qué acción realizar con el miembro:
CreateInstance
para invocar un constructor.name
se pasa por alto. No es válido con otras marcas de invocación.InvokeMethod
para invocar un método, pero no un constructor o un inicializador de tipo. No es válido conSetField
oSetProperty
. SiInvokeMethod
se especifica por sí mismo, ,BindingFlags.Public
BindingFlags.Instance
yBindingFlags.Static
se incluyen automáticamente.GetField
para obtener el valor de un campo. No es válido conSetField
.SetField
para establecer el valor de un campo. No es válido conGetField
.GetProperty
para obtener una propiedad. No es válido conSetProperty
.SetProperty
para establecer una propiedad. No es válido conGetProperty
.
Vea System.Reflection.BindingFlags para obtener más información.
Se invocará un método si se cumplen las dos condiciones siguientes:
El número de parámetros de la declaración de método es igual al número de argumentos de la
args
matriz (a menos que los argumentos predeterminados se definan en el miembro yBindingFlags.OptionalParamBinding
se especifique).El enlazador puede convertir el tipo de cada argumento en el tipo del parámetro .
El enlazador encontrará todos los métodos coincidentes. Estos métodos se encuentran en función del tipo de enlace solicitado (BindingFlags valores InvokeMethod
, GetProperty
, etc.). El conjunto de métodos se filtra por el nombre, el número de argumentos y un conjunto de modificadores de búsqueda definidos en el enlazador.
Una vez seleccionado el método, se invoca. La accesibilidad se comprueba en ese momento. La búsqueda puede controlar qué conjunto de métodos se buscan en función del atributo de accesibilidad asociado al método . El Binder.BindToMethod método de la Binder clase es responsable de seleccionar el método que se va a invocar. El enlazador predeterminado selecciona la coincidencia más específica.
InvokeMember
se puede usar para invocar métodos con parámetros que tienen valores predeterminados. Para enlazar a estos métodos, reflection debe BindingFlags.OptionalParamBinding especificarse. Para un parámetro que tiene un valor predeterminado, puede proporcionar un valor diferente o proporcionar Missing.Value para usar el valor predeterminado.
Por ejemplo, considere un método como MyMethod(int x, float y = 2.0). Para invocar este método con solo el primer argumento como MyMethod(4), pase una de las marcas de enlace anteriores y pase dos argumentos, es decir, 4 para el primer argumento y Missing.Value
para el segundo. A menos que use Missing.Value
, es posible que no omita parámetros opcionales con el Invoke
método . Si debe hacerlo, use InvokeMember
en su lugar.
Las restricciones de acceso se omiten para el código de plena confianza; es decir, se puede tener acceso a constructores privados, métodos, campos y propiedades e invocarse a través System.Reflection de cada vez que el código sea de plena confianza.
Puede usar Type.InvokeMember
para establecer un campo en un valor determinado especificando BindingFlags.SetField. Por ejemplo, si desea establecer un campo de instancia pública denominado F en la clase C y F es un String
, puede usar código como:
typeof(C).InvokeMember("F", BindingFlags.SetField, null, c, new Object[] {"strings new value"}, null, null, null);
Si F es , String[]
puede usar código como:
typeof(C).InvokeMember("F", BindingFlags.SetField, null, c, new Object[] {new String[]{"a","z","c","d"}}, null, null, null);
que inicializará el campo F en esta nueva matriz. También puede usar Type.InvokeMember
para establecer una posición en una matriz proporcionando el índice del valor y, a continuación, el siguiente mediante código como el siguiente:
typeof(C).InvokeMember("F", BindingFlags.SetField, null, c, new Object[] {1, "b"}, null, null, null);
Esto cambiará la cadena "z" de la matriz que F contiene a la cadena "b".
Nota
A partir de .NET Framework 2.0 Service Pack 1, este método se puede usar para acceder a miembros no públicos si se ha concedido ReflectionPermission al autor de la llamada con la ReflectionPermissionFlag.RestrictedMemberAccess marca y si el conjunto de concesión de los miembros no públicos está restringido al conjunto de concesión del autor de la llamada o a un subconjunto de ellos. (Consulte Consideraciones de seguridad para la reflexión).
Para usar esta funcionalidad, la aplicación debe tener como destino .NET Framework 3.5 o posterior.
Consulte también
- String
- Binder
- DefaultBinder
- BindingFlags
- ParameterModifier
- ParameterAttributes
- CultureInfo
- ReflectionPermission