我有一个派生自抽象类的类。获取派生类的类型我想找出哪些属性是从抽象类继承的,哪些属性是在派生类中声明的。
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是一个继承参数,Id,Name是在MsClass中声明的参数。有什么建议吗?
尝试使用仅声明的标志返回空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}
我错过了什么吗?
答案 0 :(得分:27)
您可以指定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);
答案 1 :(得分:11)
您可以根据DeclaringType
进行检查,如下所示:
var pros = typeof(MsClass).GetProperties()
.Where(p => p.DeclaringType == typeof(MsClass));
要从基类获取属性,您可以类似地调用:
var pros = typeof(MsClass).GetProperties()
.Where(p => p.DeclaringType == typeof(BaseMsClass));
答案 2 :(得分:3)
这可能会有所帮助:
Type type = typeof(MsClass);
Type baseType = type.BaseType;
var baseProperties =
type.GetProperties()
.Where(input => baseType.GetProperties()
.Any(i => i.Name == input.Name)).ToList();