如何找出如果属性是从基类继承或声明的派生?(How to find out if property

2019-08-18 16:34发布

我有一个从抽象类派生的类。 得到一个类型派生类中我想找出哪些属性是从抽象类继承和被宣布在派生类中。

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"
};

所以,我想快点找出CommonParam是一种遗传参数和标识,名称是MsClass声明PARAMS。 有什么建议?

尝试使用声明仅标志返回我空的PropertyInfo数组

Type type = msClass.GetType();
type.GetProperties(System.Reflection.BindingFlags.DeclaredOnly)

-->{System.Reflection.PropertyInfo[0]}

然而,的GetProperties()返回继承层次结构的所有属性。

type.GetProperties()

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

我错过了什么?

Answer 1:

您可以指定Type.GetProperties ( BindingFlags.DeclaredOnly )来获得在派生类中定义的属性。 如果你再调用GetProperties基类,你可以在基类中定义的属性。


为了获取从你的类的公共属性,你可以这样做:

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


Answer 2:

您可以检查基础上, DeclaringType如下:

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

为了从基类,你同样可以拨打属性:

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


Answer 3:

这可能帮助:

Type type = typeof(MsClass);

Type baseType = type.BaseType;

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


文章来源: How to find out if property is inherited from a base class or declared in derived?
标签: c# reflection