Métodos System.Type.GetProperty

En este artículo se proporcionan comentarios adicionales a la documentación de referencia de esta API.

Método GetProperty(String)

La búsqueda name distingue mayúsculas de minúsculas. La búsqueda incluye propiedades públicas estáticas y de instancia pública.

Una propiedad se considera pública para la reflexión si tiene al menos un descriptor de acceso público. De lo contrario, la propiedad se considera privada y debe usar BindingFlags.NonPublic | | BindingFlags.InstanceBindingFlags.Static (en Visual Basic, combinar los valores mediante Or) para obtenerla.

Si el objeto actual Type representa un tipo genérico construido, este método devuelve con PropertyInfo los parámetros de tipo reemplazados por los argumentos de tipo adecuados.

Si el objeto actual Type representa un parámetro de tipo en la definición de un tipo genérico o un método genérico, este método busca en las propiedades de la restricción de clase.

Entre las situaciones en las que AmbiguousMatchException se produce se incluyen las siguientes:

  • Un tipo contiene dos propiedades indizada que tienen el mismo nombre pero distintos números de parámetros. Para resolver la ambigüedad, use una sobrecarga del GetProperty método que especifica los tipos de parámetro.
  • Un tipo derivado declara una propiedad que oculta una propiedad heredada con el mismo nombre mediante el new modificador (Shadows en Visual Basic). Para resolver la ambigüedad, use la sobrecarga del GetProperty(String, BindingFlags) método y agregue la BindingFlags.DeclaredOnly marca para restringir la búsqueda a los miembros que no se heredan.

Método GetProperty(String, BindingFlags)

Una propiedad se considera pública para la reflexión si tiene al menos un descriptor de acceso público. De lo contrario, la propiedad se considera privada y debe usar BindingFlags.NonPublic | | BindingFlags.InstanceBindingFlags.Static (en Visual Basic, combinar los valores mediante Or) para obtenerla.

Las marcas de filtro siguientes BindingFlags se pueden usar para definir qué propiedades se van a incluir en la búsqueda:

  • Debe especificar o BindingFlags.InstanceBindingFlags.Static para obtener una devolución.
  • Especifique BindingFlags.Public para incluir propiedades públicas en la búsqueda.
  • Especifique BindingFlags.NonPublic para incluir propiedades no públicas (es decir, propiedades privadas, internas y protegidas) en la búsqueda.
  • Especifique BindingFlags.FlattenHierarchy para incluir public y protected los miembros estáticos en la jerarquía; private no se incluyen los miembros estáticos de las clases heredadas.

Se pueden usar las marcas modificadores siguientes BindingFlags para cambiar el funcionamiento de la búsqueda:

  • BindingFlags.IgnoreCase para pasar por alto el caso de name.
  • BindingFlags.DeclaredOnly para buscar solo las propiedades declaradas en , Typeno las propiedades que simplemente se heredaron.

Vea System.Reflection.BindingFlags para más información.

Si el objeto actual Type representa un tipo genérico construido, este método devuelve con PropertyInfo los parámetros de tipo reemplazados por los argumentos de tipo adecuados.

Si el objeto actual Type representa un parámetro de tipo en la definición de un tipo genérico o un método genérico, este método busca en las propiedades de la restricción de clase.

Entre las situaciones en las que AmbiguousMatchException se produce se incluyen las siguientes:

  • Un tipo contiene dos propiedades indizada que tienen el mismo nombre pero distintos números de parámetros. Para resolver la ambigüedad, use una sobrecarga del GetProperty método que especifica los tipos de parámetro.
  • Un tipo derivado declara una propiedad que oculta una propiedad heredada con el mismo nombre, utilizando el new modificador (Shadows en Visual Basic). Para resolver la ambigüedad, incluya BindingFlags.DeclaredOnly para restringir la búsqueda a los miembros que no se heredan.

GetProperty(System.String,System.ReflexionesIon. BindingFlags,System. Reflexiones ion. Binder,System.Type,System.Type[],System. Reflexiones ion. ParameterModifier[])

Una propiedad se considera pública para la reflexión si tiene al menos un descriptor de acceso público. De lo contrario, la propiedad se considera privada y debe usar BindingFlags.NonPublic | | BindingFlags.InstanceBindingFlags.Static (en Visual Basic, combinar los valores mediante Or) para obtenerla.

Aunque el enlazador predeterminado no procesa ParameterModifier (el modifiers parámetro ), puede usar la clase abstracta System.Reflection.Binder para escribir un enlazador personalizado que procesa modifiers. 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.

En la tabla siguiente se muestra qué miembros de una clase base devuelven los Get métodos al reflejar en un tipo.

Tipo de miembro estática No estático
Constructor No No
Campo No Sí. Un campo siempre se oculta por nombre y firma.
Evento No aplicable La regla del sistema de tipos común es que la herencia es la misma que la de los métodos que implementan la propiedad . Reflexiones ion trata las propiedades como hide-by-name-and-signature.2
Método No Sí. Un método (tanto virtual como no virtual) puede ocultarse por nombre u ocultar por nombre y firma.
Tipo anidado No No
Propiedad No aplicable La regla del sistema de tipos común es que la herencia es la misma que la de los métodos que implementan la propiedad . Reflexiones ion trata las propiedades como hide-by-name-and-signature.2

Notas:

  1. Hide-by-name-and-signature tiene en cuenta todas las partes de la firma, incluidos modificadores personalizados, tipos de valor devuelto, tipos de parámetros, sentinels y convenciones de llamada no administradas. Se trata de una comparación binaria.
  2. Para la reflexión, las propiedades y los eventos son hide-by-name-and-signature. Si tiene una propiedad con un descriptor de acceso get y un set en la clase base, pero la clase derivada solo tiene un descriptor de acceso get, la propiedad de clase derivada oculta la propiedad de clase base y no podrá acceder al establecedor en la clase base.
  3. Los atributos personalizados no forman parte del sistema de tipos común.

Las marcas de filtro siguientes BindingFlags se pueden usar para definir qué propiedades se van a incluir en la búsqueda:

  • Debe especificar o BindingFlags.InstanceBindingFlags.Static para obtener una devolución.
  • Especifique BindingFlags.Public para incluir propiedades públicas en la búsqueda.
  • Especifique BindingFlags.NonPublic para incluir propiedades no públicas (es decir, propiedades privadas, internas y protegidas) en la búsqueda.
  • Especifique BindingFlags.FlattenHierarchy para incluir public y protected los miembros estáticos en la jerarquía; private no se incluyen los miembros estáticos de las clases heredadas.

Se pueden usar las marcas modificadores siguientes BindingFlags para cambiar el funcionamiento de la búsqueda:

  • BindingFlags.IgnoreCase para pasar por alto el caso de name.
  • BindingFlags.DeclaredOnly para buscar solo las propiedades declaradas en , Typeno las propiedades que simplemente se heredaron.

Vea System.Reflection.BindingFlags para más información.

Si el objeto actual Type representa un tipo genérico construido, este método devuelve con PropertyInfo los parámetros de tipo reemplazados por los argumentos de tipo adecuados.

Si el objeto actual Type representa un parámetro de tipo en la definición de un tipo genérico o un método genérico, este método busca en las propiedades de la restricción de clase.

Indexadores y propiedades predeterminadas

Visual Basic, C# y C++ tienen una sintaxis simplificada para acceder a las propiedades indexadas y permiten que una propiedad indexada sea un valor predeterminado para su tipo. Por ejemplo, si la variable myList hace referencia a , ArrayListla sintaxis myList[3] (myList(3) en Visual Basic) recupera el elemento con el índice de 3. Puede sobrecargar la propiedad .

En C#, esta característica se denomina indexador y no se puede hacer referencia por nombre. De forma predeterminada, un indexador de C# aparece en los metadatos como una propiedad indizada denominada Item. Sin embargo, un desarrollador de bibliotecas de clases puede usar el IndexerNameAttribute atributo para cambiar el nombre del indexador en los metadatos. Por ejemplo, la String clase tiene un indexador denominado Chars[]. Las propiedades indizada creadas con lenguajes distintos de C# también pueden tener nombres distintos de Item.

Para determinar si un tipo tiene una propiedad predeterminada, use el GetCustomAttributes(Type, Boolean) método para probar el DefaultMemberAttribute atributo . Si el tipo tiene DefaultMemberAttribute, la MemberName propiedad devuelve el nombre de la propiedad predeterminada.