假设我有以下两个类。
public class Father
{
public int Id { get; set; }
public int Price { get; set; }
}
public class Child: Father
{
public string Name { get; set; }
}
如何知道特定属性是父属性(继承)还是子属性?
我试过
var childProperties = typeof(Child).GetProperties().Except(typeof(Father).GetProperties());
但似乎Except没有检测到Father属性和Child继承属性的相等性。
答案 0 :(得分:7)
试试这个;
var childPropertiesOnly = typeof(Child)
.GetProperties()
.Where(x => x.DeclaringType != typeof(Father))
.ToList();
答案 1 :(得分:7)
使用接受GetProperties
的BindingFlags
上的重载。在DeclaredOnly
和Public
标记旁边添加Instance
标记,然后全部设置:
var childProperties = typeof(Child)
.GetProperties(
BindingFlags.Public |
BindingFlags.Instance |
BindingFlags.DeclaredOnly // to search only the properties declared on
// the Type, not properties that
// were simply inherited.
);
这将返回一个属性Name。
请注意,使用此解决方案,您无需检查DeclaringType。
答案 2 :(得分:5)
检查PropertyInfo
上的DeclaringType
属性。这应该告诉你足够的信息。
答案 3 :(得分:1)
如果您只想要由类定义的属性而不是继承的属性,则可以将绑定标记BindingFlags.DeclaredOnly
传递给GetProperties
方法。
价: https://msdn.microsoft.com/en-us/library/system.reflection.bindingflags(v=vs.110).aspx
编辑1:
感谢rene指出这还不是一个有效的答案
实际上,我经常忘记将这些强制绑定标志传递给GetXXX
方法
程序总是按预期崩溃......
无论如何,为了使方法有效,应始终指定1)可见性/可访问性(即公共与否)和2)所需成员的范围(静态/实例)。
如果不这样做,GetXXX
的返回值将为null(或者是一个空数组,我对此不太确定,但是你明白了。)
总之,为了使事情正确,你应该:
1.从BindingFlags.Public
或BindingFlags.NonPublic
或两者中选择
2.从BindingFlags.Instance
或BidningFlags.Static
或两者中选择
3.将前面步骤中选择的标记与BindingFlags.DeclaredOnly
因此,在您的情况下,结果将是rene答案中列出的行 (我必须编辑答案,因为我似乎无法发表评论......)