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:
si usa la sobrecarga
GetProperties()
(sin parámetros), obtendrá todas las propiedades públicas .por otro lado, si usa la
GetProperties(BindingFlags)
(la que acepta un parámetroBindingFlags
), 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
oBindingFlags.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())
{
// ...
}