2009-10-09 9 views
52

si usoGetProperties() con BindingFlags.DeclaredOnly en la reflexión .NET

sometype.GetProperties(); 

que reciben todas las propiedades de la clase y de los padres. 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); 

llego 0 propiedades.

¿Alguien sabe lo que estoy haciendo mal?

+11

'Para todos los que vienen de Google:' si usted todavía no puede conseguir sus "propiedades", incluso después de ajustar banderas, si' re nuevo a C# y no conoce la diferencia entre 'Propiedades' y' Campos', intente usar 'GetFields()'. ¡Probablemente has estado buscando 'campos' todo el tiempo! – user1306322

+0

@ user1306322: solo para el registro, "vengo de google" y mi código es: 'var types = type.GetFields.Select (f => f.FieldType) .Union (type.GetProperties.Select (p => p .PropertyType)); '- y los resultados todavía cuentan 0. – Veverke

Respuesta

73

Si especifica ningún BindingFlags, entonces es necesario que especifique explícitamente lo propiedades que se desean obtener. Por ejemplo:

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

En resumen:

  1. si se utiliza el GetProperties() sobrecarga (sin parámetros), obtendrá todas las propiedades públicas .

  2. por el contrario, si se utiliza el GetProperties(BindingFlags) sobrecarga (el que acepta un parámetro BindingFlags), entonces es necesario que especifique un OR de al menos uno de cada grupo de los siguientes indicadores:

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

Por ejemplo, para obtener las propiedades estáticas públicas, tendrá que llamar GetProperties(BindingFlags.Public | BindingFlags.Static) con el fin de obtener resultados. Si llama solo GetProperties(BindingFlags.Public) o GetProperties(BindingFlags.Static) no obtendrá ningún resultado.

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

Los detalles completos se pueden encontrar en MSDN documentation for GetProperties(BindingFlags):

Los siguientes BindingFlags banderas de filtro se pueden utilizar para definir lo que anida tipos para incluir en la búsqueda:

  • debe especificar BindingFlags.Instance o BindingFlags.Static para obtener una devolución.
  • 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 BindingFlags modificadoras banderas se pueden utilizar para cambiar el funcionamiento de la búsqueda:

  • BindingFlags.DeclaredOnly para buscar sólo las propiedades declaradas en el tipo, no en las propiedades que simplemente fueron heredadas.
+0

Así que para señalar esto: * sin * BindingFlags, hay algunos valores predeterminados. ¿Sabes cuáles son? –

+1

Si usa la sobrecarga 'GetProperties()' (sin parámetros), obtendrá todas las propiedades públicas. Pero 'GetProperties (BindingFlags.Default)' devolverá una matriz vacía. – Groo

+0

Heh, entonces ¿para qué sirve BindingFlags.Default ?! ;) – UpTheCreek

15

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

Creo que lo que en realidad se está buscando es la siguiente

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

Desde el sitio MSDN.

Predeterminado (miembro) No especifica ningún marcador 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.

-1

que tenían problemas con el uso typeof(Thing), con el tiempo esto funcionó para mí:

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