Compartilhar via


Métodos System.Type.GetProperty

Este artigo fornece comentários complementares à documentação de referência para esta API.

As diretrizes a seguir se aplicam a todas as sobrecargas:

  • Uma propriedade é considerada pública para reflexão caso tenha pelo menos um acessador 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 atual Type representar um tipo genérico construído, este método retorna o PropertyInfo com os parâmetros de tipo substituídos pelos argumentos de tipo apropriados.
  • Se a corrente Type representar um parâmetro de tipo na definição de um tipo genérico ou método genérico, esse método pesquisará as propriedades da restrição de classe.

método GetProperty(String)

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

As situações em que AmbiguousMatchException ocorre 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 os 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 aos membros que não são herdados.

método GetProperty(String, BindingFlags)

Os seguintes BindingFlags sinalizadores de filtro podem ser usados para definir quais propriedades incluir 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 estão incluídos.

Os seguintes sinalizadores de modificador BindingFlags podem ser usados para alterar como a pesquisa funciona:

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

As situações em que AmbiguousMatchException ocorre 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 os 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, inclua BindingFlags.DeclaredOnly para restringir a pesquisa a membros que não são herdados.

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

Embora o associador padrão não processe ParameterModifier (o modifiers parâmetro), você pode usar a classe abstrata System.Reflection.Binder para gravar um associador personalizado que processa modifiers. ParameterModifier é usado apenas durante a chamada por meio da interoperabilidade COM e apenas os parâmetros passados por referência são manipulados.

A tabela a seguir mostra quais membros de uma classe base são retornados pelos métodos Get 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 permanece sempre oculto por nome e assinatura.
Acontecimento Não aplicável A regra de sistema do tipo comum é que a herança é a mesma dos métodos que implementam a propriedade. Reflexão trata propriedades como ocultas por nome e assinatura.2
Método Não Sim. Um método (virtual e não virtual) pode permanecer oculto por nome ou por nome e assinatura.
Tipo aninhado Não Não
Propriedade Não aplicável A regra de sistema do tipo comum é que a herança é a mesma dos métodos que implementam a propriedade. Reflexão trata propriedades como ocultas por nome e assinatura.2

Observações:

  • Oculto por nome e assinatura considera todas as partes da assinatura, inclusive modificadores personalizados, tipos de retorno, tipos de parâmetro, sentinelas e convenções de chamada não gerenciadas. Essa é uma comparação binária.
  • Para reflexão, propriedades e eventos permanecem ocultos 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 acessador get, a propriedade de classe derivada ocultará a propriedade de classe base e você não poderá acessar o setter na classe base.
  • Atributos personalizados não fazem parte do sistema de tipos comuns.

Os seguintes BindingFlags sinalizadores de filtro podem ser usados para definir quais propriedades incluir 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 estão incluídos.

Os seguintes sinalizadores de modificador BindingFlags podem ser usados para alterar como a pesquisa funciona:

  • BindingFlags.IgnoreCase para ignorar o caso de name.
  • BindingFlags.DeclaredOnly para pesquisar apenas as propriedades declaradas no Type, não propriedades que foram 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 um padrão para seu tipo. Por exemplo, se a variável myList se referir a um ArrayList, a sintaxe myList[3] (myList(3) no Visual Basic) recuperará o elemento com o índice de 3. É possível sobrecarregar a propriedade.

Em C#, esse recurso é chamado de indexador e não pode ser referenciado pelo nome. Por padrão, um indexador C# aparece em 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 com idiomas diferentes de C# 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.