Métodos System.Type.GetProperty

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

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.

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.InstanceBindingFlags.Static (no Visual Basic, combinar os valores usando Or) para obtê-la.

Caso o Type atual represente 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.

Caso o Type atual represente um parâmetro de tipo na definição de um tipo genérico ou método genérico, este método pesquisa as propriedades da restrição de classe.

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 GetProperty método 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 de método e adicione o BindingFlags.DeclaredOnly sinalizador para restringir a pesquisa a GetProperty(String, BindingFlags) membros que não são herdados.

Método GetProperty(String, BindingFlags)

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.InstanceBindingFlags.Static (no Visual Basic, combinar os valores usando Or) para obtê-la.

Os sinalizadores de filtro a seguir BindingFlags podem ser usados para definir quais propriedades incluir na pesquisa:

  • Você deve especificar 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 particulares, internas e protegidas) na pesquisa.
  • Especifique BindingFlags.FlattenHierarchy para incluir os membros estáticos public e protected acima na hierarquia; os membros estáticos private em classes herdadas não são incluídos.

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

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

Consulte System.Reflection.BindingFlags para obter mais informações.

Caso o Type atual represente 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.

Caso o Type atual represente um parâmetro de tipo na definição de um tipo genérico ou método genérico, este método pesquisa as propriedades da restrição de classe.

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 GetProperty método 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, inclua BindingFlags.DeclaredOnly para restringir a pesquisa a membros que não são herdados.

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

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.InstanceBindingFlags.Static (no Visual Basic, combinar os valores usando Or) para obtê-la.

Embora o associador padrão não processe ParameterModifier (o parâmetro modifiers ), é possível usar a classe abstrata System.Reflection.Binder para gravar um associador personalizado que processa modifiers. ParameterModifier é usado somente ao chamar por meio de interoperabilidade COM, e somente os parâmetros que são 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 durante a reflexão em um tipo.

Tipo do 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.
Evento Não aplicável A regra de sistema do tipo comum é 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.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. A reflexão trata as propriedades como ocultação por nome e assinatura.2

Observações:

  1. 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. Esta é uma comparação binária.
  2. Para reflexão, propriedades e eventos permanecem ocultos por nome e assinatura. Se você tiver uma propriedade com um acessador get e set na classe base, mas a classe derivada tiver apenas um acessador get, a propriedade de classe derivada ocultará a propriedade da classe base e você não poderá acessar o setter na classe base.
  3. Atributos personalizados não fazem parte do sistema de tipo comum.

Os sinalizadores de filtro a seguir BindingFlags podem ser usados para definir quais propriedades incluir na pesquisa:

  • Você deve especificar 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 particulares, internas e protegidas) na pesquisa.
  • Especifique BindingFlags.FlattenHierarchy para incluir os membros estáticos public e protected acima na hierarquia; os membros estáticos private em classes herdadas não são incluídos.

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

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

Consulte System.Reflection.BindingFlags para obter mais informações.

Caso o Type atual represente 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.

Caso o Type atual represente um parâmetro de tipo na definição de um tipo genérico ou método genérico, este método pesquisa as propriedades da restrição de classe.

Indexadores e propriedades padrão

Visual Basic, C# e C++ têm sintaxe simplificada 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 refere a um ArrayList, a sintaxe myList[3] (myList(3) no Visual Basic) recupera o elemento com o índice de 3. É possível sobrecarregar a propriedade.

No 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 atributo IndexerNameAttribute para alterar o nome do indexador nos metadados. Por exemplo, a classe String tem um indexador chamado Chars[]. As propriedades indexadas criadas usando linguagens diferentes do C# também podem ter nomes diferentes de Item, .

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