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.NonPublicpú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.InstanceoBindingFlags.Staticpara obtener un retorno.- Especifique
BindingFlags.Publicpara incluir propiedades públicas en la búsqueda.- Especifique
BindingFlags.NonPublicpara 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.FlattenHierarchypara 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.DeclaredOnlypara 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())
{
// ...
}