Type.InvokeMember Método
Definição
Importante
Algumas informações dizem respeito a um produto pré-lançado que pode ser substancialmente modificado antes de ser lançado. A Microsoft não faz garantias, de forma expressa ou implícita, em relação à informação aqui apresentada.
Invoca um membro específico da corrente Type.
Sobrecargas
| Name | Description |
|---|---|
| InvokeMember(String, BindingFlags, Binder, Object, Object[], ParameterModifier[], CultureInfo, String[]) |
Quando sobrescrito numa classe derivada, invoca o membro especificado, usando as restrições de ligação especificadas e correspondendo à lista de argumentos, modificadores e cultura especificados. |
| InvokeMember(String, BindingFlags, Binder, Object, Object[], CultureInfo) |
Invoca o membro especificado, usando as restrições de ligação especificadas e correspondendo à lista de argumentos e cultura especificadas. |
| InvokeMember(String, BindingFlags, Binder, Object, Object[]) |
Invoca o membro especificado, usando as restrições de ligação especificadas e correspondendo à lista de argumentos especificada. |
InvokeMember(String, BindingFlags, Binder, Object, Object[], ParameterModifier[], CultureInfo, String[])
Quando sobrescrito numa classe derivada, invoca o membro especificado, usando as restrições de ligação especificadas e correspondendo à lista de argumentos, modificadores e cultura especificados.
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);
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
A cadeia que contém o nome do construtor, método, propriedade ou membro do campo a invocar.
-ou-
Uma cadeia vazia ("") para invocar o membro padrão.
-ou-
Para IDispatch membros, uma cadeia que representa o DispID, por exemplo "[DispID=3]".
- invokeAttr
- BindingFlags
Uma combinação bit a bit dos valores de enumeração que especifica como a pesquisa é realizada. O acesso pode ser um dessesBindingFlags, como Public, NonPublic, Private, InvokeMethodGetField, e assim sucessivamente. O tipo de pesquisa não precisa de ser especificado. Se o tipo de consulta for omitido, BindingFlags.Public | | BindingFlags.InstanceBindingFlags.Static são usados.
- binder
- Binder
Um objeto que define um conjunto de propriedades e permite a ligação, que pode envolver a seleção de um método sobrecarregado, a coerção dos tipos de argumentos e a invocação de um membro através da reflexão.
-ou-
Uma referência nula (Nada em Visual Basic), para usar o DefaultBinder. Note que pode ser necessário definir explicitamente um Binder objeto para invocar com sucesso sobrecargas de métodos com argumentos variáveis.
- target
- Object
O objeto sobre o qual invocar o membro especificado.
- args
- Object[]
Um array contendo os argumentos a passar ao membro para invocar.
- modifiers
- ParameterModifier[]
Um array de ParameterModifier objetos que representa os atributos associados ao elemento correspondente no args array. Os atributos associados a um parâmetro são armazenados na assinatura do membro.
O binder padrão processa este parâmetro apenas ao chamar um componente COM.
- culture
- CultureInfo
O CultureInfo objeto que representa a localidade de globalização a utilizar, que pode ser necessário para conversões específicas da localidade, como converter uma String numérica para um Double.
-ou-
Uma referência nula (Nothing em Visual Basic) para usar o CultureInfo do thread atual.
- namedParameters
- String[]
Um array contendo os nomes dos parâmetros para os quais os valores do args array são passados.
Devoluções
Um objeto que representa o valor de retorno do membro invocado.
Implementações
Exceções
invokeAttr não contém CreateInstance e name é null.
args e modifiers não têm o mesmo comprimento.
-ou-
invokeAttr não é um atributo válido BindingFlags .
-ou-
invokeAttr não contém um dos seguintes flags de ligação: InvokeMethod, CreateInstance, GetField, SetField, GetProperty, ou SetProperty.
-ou-
invokeAttr contém CreateInstance combinado com InvokeMethod, GetField, SetField, GetProperty, ou SetProperty.
-ou-
invokeAttr contém tanto GetField como SetField.
-ou-
invokeAttr contém tanto GetProperty como SetProperty.
-ou-
invokeAttr contém InvokeMethod combinado com SetField ou SetProperty.
-ou-
invokeAttr contém SetField e args tem mais do que um elemento.
-ou-
O array de parâmetros nomeado é maior do que o array de argumentos.
-ou-
Este método é chamado a um objeto COM e uma das seguintes flags de ligação não foi passada em: BindingFlags.InvokeMethod, BindingFlags.GetProperty, BindingFlags.SetProperty, BindingFlags.PutDispProperty, ou BindingFlags.PutRefDispProperty.
-ou-
Um dos arrays de parâmetros nomeados contém uma cadeia que é null.
O membro especificado é um inicializador de classe.
O campo ou propriedade não pode ser encontrado.
Não se encontra nenhum método que corresponda aos argumentos em args.
-ou-
Não se encontra nenhum membro que tenha os nomes dos argumentos fornecidos em namedParameters.
-ou-
O objeto atual Type representa um tipo que contém parâmetros de tipo aberto, ou seja, ContainsGenericParameters devolve true.
O membro especificado não pode ser invocado em target.
Mais do que um método corresponde aos critérios de ligação.
O método representado por name possui um ou mais parâmetros genéricos de tipo não especificados. Ou seja, a propriedade do ContainsGenericParameters método devolve true.
Observações
InvokeMember chama um membro construtor ou um membro de método, obtém ou define um membro de propriedade, obtém ou definem um membro de campo de dados, ou obtém ou definem um elemento de um membro de array.
Note
Não podes usar InvokeMember para invocar um método genérico.
Quando invoca um IDispatch membro, pode especificar o DispID em vez do nome do membro, usando o formato de string "[DispID=##]". Por exemplo, se o DispID do MyComMethod for 3, pode especificar a cadeia "[DispID=3]" em vez de "MyComMethod". Invocar um membro por DispID é mais rápido do que procurar o membro pelo nome. Em cenários complexos de agregação, o DispID é por vezes a única forma de invocar o membro desejado.
Embora o binder padrão não processe ParameterModifier ou CultureInfo (os modifiers parâmetros e), culture pode usar a classe abstract System.Reflection.Binder para escrever um binder personalizado que processe modifiers e culture.
ParameterModifier é utilizado apenas ao fazer chamadas através da interoperabilidade COM, e apenas os parâmetros que são passados por referência são tratados.
Cada parâmetro no namedParameters array recebe o valor no elemento correspondente do args array. Se o comprimento de args for maior que o comprimento de namedParameters, os valores restantes dos argumentos são passados por ordem.
O namedParameters array pode ser usado para alterar a ordem dos argumentos num array de entrada. Por exemplo, dado o método M(string a, int b) (M(ByVal a As String, ByVal b As Integer) em Visual Basic) e o array de entrada { 42, "x" }, o array de entrada pode ser passado inalterado para args se o array { "b", "a" } for fornecido para namedParameters.
As seguintes BindingFlags bandeiras de filtro podem ser usadas para definir quais os membros a incluir na pesquisa:
Especifique
BindingFlags.Publicincluir membros públicos na pesquisa.Especifique
BindingFlags.NonPublicincluir membros não públicos (ou seja, privados, internos e protegidos) na busca.Especifique
BindingFlags.FlattenHierarchyincluir membros estáticos na hierarquia.
Os seguintes BindingFlags sinalizadores modificadores podem ser usados para alterar o funcionamento da pesquisa:
BindingFlags.IgnoreCaseignorar o caso dename.BindingFlags.DeclaredOnlypara procurar apenas os membros declarados no Type, não os membros que foram simplesmente herdados.
As seguintes BindingFlags bandeiras de invocação podem ser usadas para indicar que ação tomar com o membro:
CreateInstanceinvocar um construtor.nameé ignorado. Não é válido com outras bandeiras de invocação.InvokeMethodinvocar um método, mas não um construtor ou inicializador de tipos. Não válido comSetFieldouSetProperty. SeInvokeMethodfor especificado por si próprio,BindingFlags.Public,BindingFlags.Instance, eBindingFlags.Staticsão automaticamente incluídos.GetFieldpara obter o valor de um campo. Não é válido comSetField.SetFieldpara definir o valor de um campo. Não é válido comGetField.GetPropertypara adquirir uma propriedade. Não é válido comSetProperty.SetPropertypara estabelecer uma propriedade. Não é válido comGetProperty.
Consulte System.Reflection.BindingFlags para obter mais informações.
Um método será invocado se ambas as seguintes condições forem verdadeiras:
O número de parâmetros na declaração do método é igual ao número de argumentos no
argsarray (a menos que os argumentos padrão estejam definidos no membro eBindingFlags.OptionalParamBindingestejam especificados).O tipo de cada argumento pode ser convertido pelo ligador para o tipo do parâmetro.
O binder vai encontrar todos os métodos de correspondência. Estes métodos são encontrados com base no tipo de ligação requerida (BindingFlags valores InvokeMethod, GetProperty, e assim sucessivamente). O conjunto de métodos é filtrado pelo nome, número de argumentos e um conjunto de modificadores de pesquisa definidos no binder.
Depois de selecionado o método, é invocado. A acessibilidade é verificada nesse ponto. A pesquisa pode controlar que conjunto de métodos são pesquisados com base no atributo de acessibilidade associado ao método. O Binder.BindToMethod método da Binder classe é responsável por selecionar o método a ser invocado. O dossier padrão seleciona a correspondência mais específica.
InvokeMember pode ser usado para invocar métodos com parâmetros que têm valores por defeito. Para se ligar a estes métodos, é necessário BindingFlags.OptionalParamBinding especificar a Reflexão. Para um parâmetro que tem um valor predefinido, podes fornecer um valor diferente ou fornecer Missing.Value para usar o valor predefinido.
Por exemplo, considere um método como MyMethod(int x, float y = 2.0). Para invocar este método apenas com o primeiro argumento como MyMethod(4), passe uma das bandeiras de ligação acima e passe dois argumentos, nomeadamente, 4 para o primeiro argumento e Missing.Value para o segundo argumento. A menos que use Missing.Value, não pode omitir parâmetros opcionais com o Invoke método. Se for preciso, use InvokeMember em vez disso.
As restrições de acesso são ignoradas para código totalmente confiável; ou seja, construtores privados, métodos, campos e propriedades podem ser acedidos e invocados sempre System.Reflection que o código for totalmente confiável.
Pode usar Type.InvokeMember para definir um campo com um valor específico especificando BindingFlags.SetField. Por exemplo, se quiseres definir um campo de instância pública chamado F na classe C, e F é um String, podes usar código como:
typeof(C).InvokeMember("F", BindingFlags.SetField, null, c, new Object[] {"strings new value"}, null, null, null);
Se F for a String[], pode 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á o campo F nesta nova matriz. Também pode usar Type.InvokeMember para definir uma posição num array fornecendo o índice do valor e depois o valor seguinte, usando código como o seguinte:
typeof(C).InvokeMember("F", BindingFlags.SetField, null, c, new Object[] {1, "b"}, null, null, null);
Isto altera a sequência "z" no array que F mantém para a cadeia "b".
Note
Este método pode ser usado para aceder a membros não públicos se o chamador tiver recebido ReflectionPermission a ReflectionPermissionFlag.RestrictedMemberAccess bandeira e se o conjunto de concessões dos membros privados estiver restrito ao conjunto de concessão do chamador, ou a um subconjunto destes. (Ver Considerações de Segurança para reflexão.)
Para usar esta funcionalidade, a sua aplicação deve direcionar-se para o .NET Framework 3.5 ou posterior.
Ver também
- String
- Binder
- DefaultBinder
- BindingFlags
- ParameterModifier
- ParameterAttributes
- CultureInfo
- ReflectionPermission
Aplica-se a
InvokeMember(String, BindingFlags, Binder, Object, Object[], CultureInfo)
Invoca o membro especificado, usando as restrições de ligação especificadas e correspondendo à lista de argumentos e cultura especificadas.
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:
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);
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
member 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
A cadeia que contém o nome do construtor, método, propriedade ou membro do campo a invocar.
-ou-
Uma cadeia vazia ("") para invocar o membro padrão.
-ou-
Para IDispatch membros, uma cadeia que representa o DispID, por exemplo "[DispID=3]".
- invokeAttr
- BindingFlags
Uma combinação bit a bit dos valores de enumeração que especifica como a pesquisa é realizada. O acesso pode ser um dessesBindingFlags, como Public, NonPublic, Private, InvokeMethodGetField, e assim sucessivamente. O tipo de pesquisa não precisa de ser especificado. Se o tipo de consulta for omitido, BindingFlags.Public | | BindingFlags.InstanceBindingFlags.Static são usados.
- binder
- Binder
Um objeto que define um conjunto de propriedades e permite a ligação, que pode envolver a seleção de um método sobrecarregado, a coerção dos tipos de argumentos e a invocação de um membro através da reflexão.
-ou-
Uma referência nula (Nothing em Visual Basic), para usar o DefaultBinder. Note que pode ser necessário definir explicitamente um Binder objeto para invocar com sucesso sobrecargas de métodos com argumentos variáveis.
- target
- Object
O objeto sobre o qual invocar o membro especificado.
- args
- Object[]
Um array contendo os argumentos a passar ao membro para invocar.
- culture
- CultureInfo
O objeto que representa a localidade de globalização a utilizar, que pode ser necessário para conversões específicas da localidade, como converter um numérico String para um Double.
-ou-
Uma referência nula (Nothing em Visual Basic) para usar o CultureInfo do thread atual.
Devoluções
Um objeto que representa o valor de retorno do membro invocado.
Implementações
Exceções
invokeAttr não contém CreateInstance e name é null.
invokeAttr não é um atributo válido BindingFlags .
-ou-
invokeAttr não contém um dos seguintes flags de ligação: InvokeMethod, CreateInstance, GetField, SetField, GetProperty, ou SetProperty.
-ou-
invokeAttr contém CreateInstance combinado com InvokeMethod, GetField, SetField, GetProperty, ou SetProperty.
-ou-
invokeAttr contém tanto GetField como SetField.
-ou-
invokeAttr contém tanto GetProperty como SetProperty.
-ou-
invokeAttr contém InvokeMethod combinado com SetField ou SetProperty.
-ou-
invokeAttr contém SetField e args tem mais do que um elemento.
-ou-
Este método é chamado a um objeto COM e uma das seguintes flags de ligação não foi passada em: BindingFlags.InvokeMethod, BindingFlags.GetProperty, BindingFlags.SetProperty, BindingFlags.PutDispProperty, ou BindingFlags.PutRefDispProperty.
-ou-
Um dos arrays de parâmetros nomeados contém uma cadeia que é null.
O membro especificado é um inicializador de classe.
O campo ou propriedade não pode ser encontrado.
Não se encontra nenhum método que corresponda aos argumentos em args.
-ou-
O objeto atual Type representa um tipo que contém parâmetros de tipo aberto, ou seja, ContainsGenericParameters devolve true.
O membro especificado não pode ser invocado em target.
Mais do que um método corresponde aos critérios de ligação.
O método representado por name possui um ou mais parâmetros genéricos de tipo não especificados. Ou seja, a propriedade do ContainsGenericParameters método devolve true.
Observações
Embora o fichário padrão não processe CultureInfo (o culture parâmetro), você pode usar a classe abstrata System.Reflection.Binder para escrever um fichário personalizado que processa culture.
Note
Não podes usar InvokeMember para invocar um método genérico.
As seguintes BindingFlags bandeiras de filtro podem ser usadas para definir quais os membros a incluir na pesquisa:
Especifique
BindingFlags.Publicincluir membros públicos na pesquisa.Especifique
BindingFlags.NonPublicincluir membros não públicos (ou seja, privados, internos e protegidos) na busca.Especifique
BindingFlags.FlattenHierarchyincluir membros estáticos na hierarquia.
Os seguintes BindingFlags sinalizadores modificadores podem ser usados para alterar o funcionamento da pesquisa:
BindingFlags.IgnoreCaseignorar o caso dename.BindingFlags.DeclaredOnlypara procurar apenas os membros declarados no Type, não os membros que foram simplesmente herdados.
As seguintes BindingFlags bandeiras de invocação podem ser usadas para indicar que ação tomar com o membro:
CreateInstanceinvocar um construtor.nameé ignorado. Não é válido com outras bandeiras de invocação.InvokeMethodinvocar um método, mas não um construtor ou inicializador de tipos. Não válido comSetFieldouSetProperty. SeInvokeMethodfor especificado por si próprio,BindingFlags.Public,BindingFlags.Instance, eBindingFlags.Staticsão automaticamente incluídos.GetFieldpara obter o valor de um campo. Não é válido comSetField.SetFieldpara definir o valor de um campo. Não é válido comGetField.GetPropertypara adquirir uma propriedade. Não é válido comSetProperty.SetPropertypara estabelecer uma propriedade. Não é válido comGetProperty.
Consulte System.Reflection.BindingFlags para obter mais informações.
Um método será invocado se ambas as seguintes condições forem verdadeiras:
O número de parâmetros na declaração do método é igual ao número de argumentos no
argsarray (a menos que os argumentos padrão estejam definidos no membro eBindingFlags.OptionalParamBindingestejam especificados).O tipo de cada argumento pode ser convertido pelo ligador para o tipo do parâmetro.
O binder vai encontrar todos os métodos de correspondência. Estes métodos são encontrados com base no tipo de ligação requerida (BindingFlags valores InvokeMethod, GetProperty, e assim sucessivamente). O conjunto de métodos é filtrado pelo nome, número de argumentos e um conjunto de modificadores de pesquisa definidos no binder.
Depois de selecionado o método, é invocado. A acessibilidade é verificada nesse ponto. A pesquisa pode controlar que conjunto de métodos são pesquisados com base no atributo de acessibilidade associado ao método. O Binder.BindToMethod método da Binder classe é responsável por selecionar o método a ser invocado. O dossier padrão seleciona a correspondência mais específica.
As restrições de acesso são ignoradas para código totalmente confiável; ou seja, construtores privados, métodos, campos e propriedades podem ser acedidos e invocados através de Reflection sempre que o código for totalmente confiável.
Pode usar Type.InvokeMember para definir um campo com um valor específico especificando BindingFlags.SetField. Por exemplo, se quiser definir um campo de instância pública chamado F na classe C, e F é a String , pode usar código como:
typeof(C).InvokeMember("F", BindingFlags.SetField, null, c, new Object[] {"strings new value"}, null);
Se F for a String[], pode usar código como:
typeof(C).InvokeMember("F", BindingFlags.SetField, null, c, new Object[] {new String[]{"a","z","c","d"}}, null);
que inicializará o campo F nesta nova matriz. Também pode usar Type.InvokeMember para definir uma posição num array fornecendo o índice do valor e depois o valor seguinte, usando código como o seguinte:
typeof(C).InvokeMember("F", BindingFlags.SetField, null, c, new Object[] {1, "b"}, null);
Isto altera a sequência "z" no array que F mantém para a cadeia "b".
Quando invoca um IDispatch membro, pode especificar o DispID em vez do nome do membro, usando o formato de string "[DispID=##]". Por exemplo, se o DispID do MyComMethod for 3, pode especificar a cadeia "[DispID=3]" em vez de "MyComMethod". Invocar um membro por DispID é mais rápido do que procurar o membro pelo nome. Em cenários complexos de agregação, o DispID é por vezes a única forma de invocar o membro desejado.
Note
Este método pode ser usado para aceder a membros não públicos se o chamador tiver recebido ReflectionPermission a ReflectionPermissionFlag.RestrictedMemberAccess bandeira e se o conjunto de concessões dos membros privados estiver restrito ao conjunto de concessão do chamador, ou a um subconjunto destes. (Ver Considerações de Segurança para reflexão.)
Para usar esta funcionalidade, a sua aplicação deve direcionar-se para o .NET Framework 3.5 ou posterior.
Ver também
- String
- Binder
- DefaultBinder
- BindingFlags
- ParameterModifier
- ParameterAttributes
- CultureInfo
- ReflectionPermission
Aplica-se a
InvokeMember(String, BindingFlags, Binder, Object, Object[])
Invoca o membro especificado, usando as restrições de ligação especificadas e correspondendo à lista de argumentos especificada.
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:
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);
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
member 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
A cadeia que contém o nome do construtor, método, propriedade ou membro do campo a invocar.
-ou-
Uma cadeia vazia ("") para invocar o membro padrão.
-ou-
Para IDispatch membros, uma cadeia que representa o DispID, por exemplo "[DispID=3]".
- invokeAttr
- BindingFlags
Uma combinação bit a bit dos valores de enumeração que especifica como a pesquisa é realizada. O acesso pode ser um dessesBindingFlags, como Public, NonPublic, Private, InvokeMethodGetField, e assim sucessivamente. O tipo de pesquisa não precisa de ser especificado. Se o tipo de consulta for omitido, BindingFlags.Public | | BindingFlags.InstanceBindingFlags.Static são usados.
- binder
- Binder
Um objeto que define um conjunto de propriedades e permite a ligação, que pode envolver a seleção de um método sobrecarregado, a coerção dos tipos de argumentos e a invocação de um membro através da reflexão.
-ou-
Uma referência nula (Nothing em Visual Basic), para usar o DefaultBinder. Note que pode ser necessário definir explicitamente um Binder objeto para invocar com sucesso sobrecargas de métodos com argumentos variáveis.
- target
- Object
O objeto sobre o qual invocar o membro especificado.
- args
- Object[]
Um array contendo os argumentos a passar ao membro para invocar.
Devoluções
Um objeto que representa o valor de retorno do membro invocado.
Implementações
Exceções
invokeAttr não contém CreateInstance e name é null.
invokeAttr não é um atributo válido BindingFlags .
-ou-
invokeAttr não contém um dos seguintes flags de ligação: InvokeMethod, CreateInstance, GetField, SetField, GetProperty, ou SetProperty.
-ou-
invokeAttr contém CreateInstance combinado com InvokeMethod, GetField, SetField, GetProperty, ou SetProperty.
-ou-
invokeAttr contém tanto GetField como SetField.
-ou-
invokeAttr contém tanto GetProperty como SetProperty.
-ou-
invokeAttr contém InvokeMethod combinado com SetField ou SetProperty.
-ou-
invokeAttr contém SetField e args tem mais do que um elemento.
-ou-
Este método é chamado a um objeto COM e uma das seguintes flags de ligação não foi passada em: BindingFlags.InvokeMethod, BindingFlags.GetProperty, BindingFlags.SetProperty, BindingFlags.PutDispProperty, ou BindingFlags.PutRefDispProperty.
-ou-
Um dos arrays de parâmetros nomeados contém uma cadeia que é null.
O membro especificado é um inicializador de classe.
O campo ou propriedade não pode ser encontrado.
Não se encontra nenhum método que corresponda aos argumentos em args.
-ou-
O objeto atual Type representa um tipo que contém parâmetros de tipo aberto, ou seja, ContainsGenericParameters devolve true.
O membro especificado não pode ser invocado em target.
Mais do que um método corresponde aos critérios de ligação.
O .NET Compact Framework atualmente não suporta este método.
O método representado por name possui um ou mais parâmetros genéricos de tipo não especificados. Ou seja, a propriedade do ContainsGenericParameters método devolve true.
Exemplos
O exemplo seguinte é usado InvokeMember para aceder a membros de um tipo.
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
Observações
Note
Não podes usar InvokeMember para invocar um método genérico.
As seguintes BindingFlags bandeiras de filtro podem ser usadas para definir quais os membros a incluir na pesquisa:
Especifique
BindingFlags.Publicincluir membros públicos na pesquisa.Especifique
BindingFlags.NonPublicincluir membros não públicos (ou seja, membros privados e protegidos) na pesquisa.Especifique
BindingFlags.FlattenHierarchyincluir membros estáticos na hierarquia.
Os seguintes BindingFlags sinalizadores modificadores podem ser usados para alterar o funcionamento da pesquisa:
BindingFlags.IgnoreCaseignorar o caso dename.BindingFlags.DeclaredOnlypara procurar apenas os membros declarados no Type, não os membros que foram simplesmente herdados.
As seguintes BindingFlags bandeiras de invocação podem ser usadas para indicar que ação tomar com o membro:
CreateInstanceinvocar um construtor.nameé ignorado. Não é válido com outras bandeiras de invocação.InvokeMethodinvocar um método, mas não um construtor ou inicializador de tipos. Não válido comSetFieldouSetProperty. SeInvokeMethodfor especificado por si próprio,BindingFlags.Public,BindingFlags.Instance, eBindingFlags.Staticsão automaticamente incluídos.GetFieldpara obter o valor de um campo. Não é válido comSetField.SetFieldpara definir o valor de um campo. Não é válido comGetField.GetPropertypara adquirir uma propriedade. Não é válido comSetProperty.SetPropertypara estabelecer uma propriedade. Não é válido comGetProperty.
Consulte System.Reflection.BindingFlags para obter mais informações.
Um método será invocado se ambas as seguintes condições forem verdadeiras:
O número de parâmetros na declaração do método é igual ao número de argumentos no
argsarray (a menos que os argumentos padrão estejam definidos no membro eBindingFlags.OptionalParamBindingestejam especificados).O tipo de cada argumento pode ser convertido pelo ligador para o tipo do parâmetro.
O binder vai encontrar todos os métodos de correspondência. Estes métodos são encontrados com base no tipo de ligação requerida (BindingFlags valores InvokeMethod, GetProperty, e assim sucessivamente). O conjunto de métodos é filtrado pelo nome, número de argumentos e um conjunto de modificadores de pesquisa definidos no binder.
Depois de selecionado o método, é invocado. A acessibilidade é verificada nesse ponto. A pesquisa pode controlar que conjunto de métodos são pesquisados com base no atributo de acessibilidade associado ao método. O Binder.BindToMethod método da Binder classe é responsável por selecionar o método a ser invocado. O dossier padrão seleciona a correspondência mais específica.
As restrições de acesso são ignoradas para código totalmente confiável; ou seja, construtores privados, métodos, campos e propriedades podem ser acedidos e invocados sempre System.Reflection que o código for totalmente confiável.
Pode usar Type.InvokeMember para definir um campo com um valor específico especificando BindingFlags.SetField. Por exemplo, se quiseres definir um campo de instância pública chamado F na classe C, e F é um String, podes usar código como:
typeof(C).InvokeMember("F", BindingFlags.SetField, null, c, new Object[] {"strings new value"});
Se F for a String[], pode usar código como:
typeof(C).InvokeMember("F", BindingFlags.SetField, null, c, new Object[] {new String[]{"a","z","c","d"}});
que inicializará o campo F nesta nova matriz. Também pode usar Type.InvokeMember para definir uma posição num array fornecendo o índice do valor e depois o valor seguinte, usando código como o seguinte:
typeof(C).InvokeMember("F", BindingFlags.SetField, null, c, new Object[] {1, "b"});
Isto altera a sequência "z" no array que F mantém para a cadeia "b".
Quando invoca um IDispatch membro, pode especificar o DispID em vez do nome do membro, usando o formato string "[DispID=##]". Por exemplo, se o DispID do MyComMethod for 3, pode especificar a cadeia "[DispID=3]" em vez de "MyComMethod". Invocar um membro por DispID é mais rápido do que procurar o membro pelo nome. Em cenários complexos de agregação, o DispID é por vezes a única forma de invocar o membro desejado.
Note
Este método pode ser usado para aceder a membros não públicos se o chamador tiver recebido ReflectionPermission a ReflectionPermissionFlag.RestrictedMemberAccess bandeira e se o conjunto de concessões dos membros privados estiver restrito ao conjunto de concessão do chamador, ou a um subconjunto destes. (Ver Considerações de Segurança para reflexão.)
Para usar esta funcionalidade, a sua aplicação deve direcionar-se para o .NET Framework 3.5 ou posterior.
Ver também
- String
- Binder
- DefaultBinder
- BindingFlags
- ParameterModifier
- ParameterAttributes
- CultureInfo
- ReflectionPermission