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));