c# reflection

c# - ¿Cómo saber si la propiedad se hereda de una clase base o se declara en derivada?



reflection (3)

Esto puede ayudar:

Type type = typeof(MsClass); Type baseType = type.BaseType; var baseProperties = type.GetProperties() .Where(input => baseType.GetProperties() .Any(i => i.Name == input.Name)).ToList();

Tengo una clase que se deriva de una clase abstracta. Obtención de un tipo de una clase derivada Quiero averiguar qué propiedades se heredan de la clase abstracta y cuáles se declararon en la clase derivada.

public abstract class BaseMsClass { public string CommonParam { get; set; } } public class MsClass : BaseMsClass { public string Id { get; set; } public string Name { get; set; } public MsClass() { } } var msClass = new MsClass { Id = "1122", Name = "Some name", CommonParam = "param of the base class" };

Por lo tanto, me gustaría descubrir rápidamente que CommonParam es un parámetro heredado e Id, Name son parámetros declarados en MsClass. ¿Alguna sugerencia?

El intento de usar la marca solo declarada me devuelve una matriz PropertyInfo vacía

Type type = msClass.GetType(); type.GetProperties(System.Reflection.BindingFlags.DeclaredOnly) -->{System.Reflection.PropertyInfo[0]}

Sin embargo, GetProperties () devuelve todas las propiedades de la jerarquía de herencia.

type.GetProperties() -->{System.Reflection.PropertyInfo[3]} -->[0]: {System.String Id} -->[1]: {System.String Name} -->[2]: {System.String CommonParam}

¿Me he perdido algo?


Puede especificar Type.GetProperties ( BindingFlags.DeclaredOnly ) para obtener las propiedades que están definidas en la clase derivada. Si luego llama a GetProperties en la clase base, puede obtener las propiedades definidas en la clase base.

Para obtener las propiedades públicas de tu clase, puedes hacer:

var classType = typeof(MsClass); var classProps = classType.GetProperties(BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.Public); var inheritedProps = classType.BaseType.GetProperties(BindingFlags.Public | BindingFlags.Instance);


Puede verificar en base al tipo de DeclaringType siguiente manera:

var pros = typeof(MsClass).GetProperties() .Where(p => p.DeclaringType == typeof(MsClass));

Para obtener propiedades de la clase base puede llamar de manera similar:

var pros = typeof(MsClass).GetProperties() .Where(p => p.DeclaringType == typeof(BaseMsClass));