with net method español create c# .net reflection

c# - method - Usando GetProperties() con BindingFlags.DeclaredOnly en.NET Reflection



reflection c# español (5)

Si uso

sometype.GetProperties();

Obtengo todas las propiedades del tipo y es padre. Sin embargo, solo quiero recuperar las propiedades definidas explícitamente en este tipo (no los padres). Pensé que para eso era la opción BindingFlags.DeclaredOnly .

Sin embargo, cuando intento esto:

sometype.GetProperties(BindingFlags.DeclaredOnly);

Obtengo 0 propiedades.

¿Alguien sabe lo que estoy haciendo mal?


Desde el sitio de MSDN .

Predeterminado (miembro) No especifica ninguna bandera de enlace.

Debe especificar Instancia o Estático junto con Público o No Público o no se devolverán los miembros.

Por lo tanto, a menos que especifique las banderas de encuadernación no obtendrá nada.


Necesitas expandir tu BindingsFlag un poco. Necesitan al menos incluir qué nivel de accesibilidad e instancia vs. estática para recuperar algo significativo.

Creo que lo que realmente buscas es lo siguiente

var flags = BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.Public; someType.GetProperties(flags);


Para resumir:

  1. si usa la sobrecarga GetProperties() (sin parámetros), obtendrá todas las propiedades públicas .

  2. por otro lado, si usa la GetProperties(BindingFlags) (la que acepta un parámetro BindingFlags ), entonces necesita especificar un OR bit a bit de al menos uno de cada grupo de los siguientes indicadores:

    • BindingFlags.Instance / BindingFlags.Static (instancia frente a propiedades estáticas),
    • BindingFlags.Public / BindingFlags.NonPublic ( BindingFlags.NonPublic públicas vs. no públicas).

Por ejemplo, para obtener propiedades públicas estáticas, deberá llamar a GetProperties(BindingFlags.Public | BindingFlags.Static) para obtener resultados. Llamar solo a GetProperties(BindingFlags.Public) o GetProperties(BindingFlags.Static) no arrojará ningún resultado.

Tenga en cuenta también que al especificar BindingFlags.Default se devolverá una matriz vacía .

Los detalles completos se pueden encontrar en la GetProperties(BindingFlags) :

Los siguientes indicadores de filtro BindingFlags se pueden usar para definir qué tipos anidados incluir en la búsqueda:

  • Debe especificar BindingFlags.Instance o BindingFlags.Static para obtener un retorno.
  • Especifique BindingFlags.Public para incluir propiedades públicas en la búsqueda.
  • Especifique BindingFlags.NonPublic para incluir métodos no públicos (es decir, métodos privados, internos y protegidos) en la búsqueda. Solo se devuelven métodos internos y protegidos en clases base; los métodos privados en las clases base no se devuelven.
  • Especifique BindingFlags.FlattenHierarchy para incluir miembros estáticos públicos y protegidos en la jerarquía; los miembros estáticos privados en las clases heredadas no están incluidos.

Los siguientes indicadores de modificador BindingFlags se pueden usar para cambiar el funcionamiento de la búsqueda:

  • BindingFlags.DeclaredOnly para buscar solo las propiedades declaradas en el Tipo, no las propiedades que simplemente se heredaron.

Si especifica cualquier BindingFlags , entonces debe especificar explícitamente qué propiedades desea obtener. Por ejemplo:

sometype.GetProperties (BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.Instance);


Tuve problemas al usar typeof(Thing) , eventualmente esto funcionó para mí:

var thisThing = (new Thing()).GetType(); foreach (var property in thisThing.GetProperties()) { // ... }