Usando GetProperties () con BindingFlags.DeclaredOnly en .NET Reflection

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 bash esto:

 sometype.GetProperties(BindingFlags.DeclaredOnly); 

Obtengo 0 propiedades.

¿Alguien sabe lo que estoy haciendo mal?

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

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

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 documentación de MSDN para GetProperties (BindingFlags) :

Los siguientes indicadores de filtro BindingFlags se pueden usar para definir qué tipos nesteds 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.

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); 

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.

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

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