如何排除父类

时间:2018-01-02 12:03:24

标签: c# inheritance reflection

假设我有以下两个类。

  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继承属性的相等性。

4 个答案:

答案 0 :(得分:7)

试试这个;

var childPropertiesOnly = typeof(Child)
         .GetProperties()
         .Where(x => x.DeclaringType != typeof(Father))
         .ToList();

答案 1 :(得分:7)

使用接受GetPropertiesBindingFlags上的重载。在DeclaredOnlyPublic标记旁边添加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。

exclude inherited properties debug

请注意,使用此解决方案,您无需检查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.PublicBindingFlags.NonPublic或两者中选择 2.从BindingFlags.InstanceBidningFlags.Static或两者中选择 3.将前面步骤中选择的标记与BindingFlags.DeclaredOnly

组合在一起

因此,在您的情况下,结果将是rene答案中列出的行 (我必须编辑答案,因为我似乎无法发表评论......)