Os métodos de System.Type.GetProperty

Observação

Este artigo fornece observações complementares à documentação de referência para esta API.

As orientações a seguir se aplicam a todas as sobrecargas:

  • Um imóvel é considerado público para reflexão se tiver pelo menos um acessor que seja público. Caso contrário, a propriedade é considerada privada, e você deve usar BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static (no Visual Basic, combinar os valores usando Or) para obtê-la.
  • Se o current Type representa um tipo genérico construído, esse método retorna o PropertyInfo com os parâmetros type substituídos pelos argumentos de tipo apropriados.
  • Se o current Type representa um parâmetro type na definição de um tipo genérico ou método genérico, esse método pesquisa as propriedades da restrição de classe.

GetProperty(String) método

A pesquisa diferencia name maiúsculas de minúsculas. A pesquisa inclui propriedades estáticas públicas e de instância pública.

As situações em que AmbiguousMatchException ocorrem incluem o seguinte:

  • Um tipo contém duas propriedades indexadas que têm o mesmo nome, mas números diferentes de parâmetros. Para resolver a ambiguidade, use uma sobrecarga do método GetProperty que especifica tipos de parâmetro.
  • Um tipo derivado declara uma propriedade que oculta uma propriedade herdada com o mesmo nome, usando o new modificador (Shadows no Visual Basic). Para resolver a ambiguidade, use a sobrecarga do método GetProperty(String, BindingFlags) e adicione o sinalizador BindingFlags.DeclaredOnly para restringir a pesquisa a membros que não são herdados.

GetProperty(String, BindingFlags) método

Os seguintes BindingFlags sinalizadores de filtro podem ser usados para definir quais propriedades devem ser incluídas na pesquisa:

  • Você deve especificar ou BindingFlags.Instance ou BindingFlags.Static para obter um retorno.
  • Especifique BindingFlags.Public para incluir propriedades públicas na pesquisa.
  • Especifique BindingFlags.NonPublic para incluir propriedades não públicas (ou seja, propriedades privadas, internas e protegidas) na pesquisa.
  • Especifique BindingFlags.FlattenHierarchy para incluir public e protected membros estáticos na hierarquia; private membros estáticos em classes herdadas não são incluídos.

Os seguintes BindingFlags sinalizadores modificadores podem ser usados para alterar o funcionamento da pesquisa:

  • BindingFlags.IgnoreCase ignorar o caso de name.
  • BindingFlags.DeclaredOnly para pesquisar apenas as propriedades declaradas no Type, e não nas propriedades simplesmente herdadas.

As situações em que AmbiguousMatchException ocorrem incluem o seguinte:

  • Um tipo contém duas propriedades indexadas que têm o mesmo nome, mas números diferentes de parâmetros. Para resolver a ambiguidade, use uma sobrecarga do método GetProperty que especifica tipos de parâmetro.
  • Um tipo derivado declara uma propriedade que oculta uma propriedade herdada com o mesmo nome, usando o new modificador (Shadows no Visual Basic). Para eliminar a ambiguidade, inclua BindingFlags.DeclaredOnly para restringir a pesquisa a membros que não foram herdados.

Método GetProperty(System.String, System.Reflection.BindingFlags, System.Reflection.Binder, System.Type, System.Type[], System.Reflection.ParameterModifier[])

Embora o fichário padrão não processe ParameterModifier (o modifiers parâmetro), você pode usar a classe abstrata System.Reflection.Binder para escrever um fichário personalizado que processa modifiers. 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.

A tabela a seguir mostra quais membros de uma classe base são retornados pelos Get métodos ao refletir sobre um tipo.

Tipo de Membro Estático Não-estático
Construtor Não Não
Campo Não Sim. Um campo é sempre ocultado com base no nome e assinatura.
Evento Não aplicável A regra comum do sistema de tipos é que a herança é a mesma dos métodos que implementam a propriedade. A reflexão trata as propriedades como ocultação por nome e assinatura.
Método Não Sim. Um método (virtual e não virtual) pode ser ocultado por nome ou ocultado por nome e assinatura.
Tipo aninhado Não Não
Propriedade Não aplicável A regra comum do sistema de tipos é que a herança é a mesma dos métodos que implementam a propriedade. A reflexão trata as propriedades como ocultação por nome e assinatura.

Observações:

  • Ocultar por nome e assinatura considera todas as partes da assinatura, incluindo modificadores personalizados, tipos de retorno, tipos de parâmetros, sentinelas e convenções de chamada não gerenciadas. Esta é uma comparação binária.
  • Para reflexão, as propriedades e os eventos são ocultados por nome e assinatura. Se você tiver uma propriedade com um acessador get e um set na classe base, mas a classe derivada tiver apenas um acessor get, a propriedade de classe derivada ocultará a propriedade de classe base e você não poderá acessar o setter na classe base.
  • Os atributos personalizados não fazem parte do sistema de tipo comum.

Os seguintes BindingFlags sinalizadores de filtro podem ser usados para definir quais propriedades devem ser incluídas na pesquisa:

  • Você deve especificar ou BindingFlags.Instance ou BindingFlags.Static para obter um retorno.
  • Especifique BindingFlags.Public para incluir propriedades públicas na pesquisa.
  • Especifique BindingFlags.NonPublic para incluir propriedades não públicas (ou seja, propriedades privadas, internas e protegidas) na pesquisa.
  • Especifique BindingFlags.FlattenHierarchy para incluir public e protected membros estáticos na hierarquia; private membros estáticos em classes herdadas não são incluídos.

Os seguintes BindingFlags sinalizadores modificadores podem ser usados para alterar o funcionamento da pesquisa:

  • BindingFlags.IgnoreCase ignorar o caso de name.
  • BindingFlags.DeclaredOnly para pesquisar apenas as propriedades declaradas no Type, e não nas propriedades simplesmente herdadas.

Indexadores e propriedades padrão

Visual Basic, C# e C++ simplificaram a sintaxe para acessar propriedades indexadas e permitem que uma propriedade indexada seja padrão para seu tipo. Por exemplo, se a variável myList se refere a um ArrayList, a sintaxe myList[3] (myList(3) no Visual Basic) recupera o elemento com o índice de 3. Você pode sobrecarregar a propriedade.

Em C#, esse recurso é chamado de indexador e não pode ser referido pelo nome. Por padrão, um indexador C# aparece nos metadados como uma propriedade indexada chamada Item. No entanto, um desenvolvedor de biblioteca de classes pode usar o IndexerNameAttribute atributo para alterar o nome do indexador nos metadados. Por exemplo, a String classe tem um indexador chamado Chars[]. As propriedades indexadas criadas usando linguagens diferentes de C# também podem ter nomes diferentes de Item, .

Para determinar se um tipo tem uma propriedade padrão, use o GetCustomAttributes(Type, Boolean) método para testar o DefaultMemberAttribute atributo. Se o tipo tiver DefaultMemberAttribute, a MemberName propriedade retornará o nome da propriedade padrão.