如何确定属性是从基类继承还是在派生中声明?

Max*_*xim 20 c# reflection

我有一个派生自抽象类的类.获取派生类的类型我想找出哪些属性是从抽象类继承的,哪些属性是在派生类中声明的.

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"
};
Run Code Online (Sandbox Code Playgroud)

所以,我想快速找出CommonParam是一个继承参数,Id,Name是在MsClass中声明的参数.有什么建议?

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

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

-->{System.Reflection.PropertyInfo[0]}
Run Code Online (Sandbox Code Playgroud)

但是,GetProperties()返回继承层次结构的所有属性.

type.GetProperties()

-->{System.Reflection.PropertyInfo[3]}
-->[0]: {System.String Id}
-->[1]: {System.String Name}
-->[2]: {System.String CommonParam}
Run Code Online (Sandbox Code Playgroud)

我错过了什么?

Ree*_*sey 29

您可以指定获取派生类中定义的属性.如果随后调用基类,则可以获取基类中定义的属性.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);
Run Code Online (Sandbox Code Playgroud)

  • 不知何故,这种方法没有给出预期的结果.问题已更新. (3认同)
  • @Maxim你需要`type.GetProperties(BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.Public)`.+1到里德,希望他能更新答案 (3认同)

cuo*_*gle 12

您可以根据DeclaringType以下内容进行检查:

var pros = typeof(MsClass).GetProperties()
                          .Where(p => p.DeclaringType == typeof(MsClass));
Run Code Online (Sandbox Code Playgroud)

要从基类获取属性,您可以类似地调用:

var pros = typeof(MsClass).GetProperties()
                          .Where(p => p.DeclaringType == typeof(BaseMsClass));
Run Code Online (Sandbox Code Playgroud)