Obtener por reflexión las propiedades de la clase, pero no de la clase heredada

80
class Parent {
   public string A { get; set; }
}

class Child : Parent {
   public string B { get; set; }
}

Necesito obtener solo la propiedad B, sin la propiedad A, pero

Child.GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance)

devuelve ambas propiedades: /

netmajor
fuente

Respuestas:

155

Debe agregar BindingFlags.DeclaredOnly a sus banderas, es decir:

typeof(Child).GetProperties(System.Reflection.BindingFlags.Public
    | System.Reflection.BindingFlags.Instance
    | System.Reflection.BindingFlags.DeclaredOnly)
Francesco Baruchelli
fuente
2
¿Puede esto al revés? Parent.GetProperties () y obtenga todas las propiedades del padre y del hijo si el objeto específico es heredado por el hijo
Maiko Kingma
10

Intente usar la marca de enlace DeclaredOnly. Debería limitar las propiedades devueltas solo a las declaradas en la clase que le interesa. Y aquí hay una muestra de código:

PropertyInfo[] properties = typeof(Child).GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.DeclaredOnly);
ScorpiAS
fuente
4

Añadir BindingFlags.DeclaredOnly

Tigran
fuente
4

De Type.cs : en este caso, utilice DeclaredOnlyLookup

  private const BindingFlags DefaultLookup = BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public;
  internal const BindingFlags DeclaredOnlyLookup = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static | BindingFlags.DeclaredOnly;
eran otzap
fuente
1
Interesante, usaré este enfoque y definiré mi propia const BindingFlags. +1 para buscar en el código fuente.
C.Tewalt