首页 > 解决方案 > 如何忽略使用反射继承的类的所有隐藏属性?

问题描述

我有一个问题,我需要从一个对象中获取所有属性,然后对属性进行排序并将某些属性的值发送到另一个服务。以下是代码示例:

public class Class1
{
    public string A { get; set; }
    public bool B  { get; set; }
}

public class Class2 : Class1 
{
    public new bool? B { get; set; }
    public bool C { get; set; }
}

我需要获取 Class2 的所有属性,但是在使用 Class2.GetType().GetProperties() 时,结果包含 Class2 AND Class1 中的 B。这导致了我的问题,因为在循环每个属性时我发送 B 两次,一次具有默认值 false 因为它从未设置,然后另一个具有由我的服务设置的正确值。我需要结果包含 Class2 中的 B、Class1 中的 A 和 Class2 中的 C,但忽略 Class1 中的 B,因为它已被 new 关键字隐藏。

我试过查看我可以使用的绑定标志,但没有帮助。我能找到的最接近的标志是 BindingFlags.DeclaredOnly 标志,但它不包括 Class1 中的 A,所以它对我不起作用。

如果原始属性已被隐藏,我将如何忽略它?

标签: c#system.reflection

解决方案


如果我理解正确,您需要来自未重新定义的所有属性Class2和所有属性Class1Class2

您可以通过两次调用来实现这一点GetProperties:首先选择所有定义的Class2然后访问类型Class1并添加任何缺少的

var type = typeof(Class2);
var list = new List<PropertyInfo>();
list.AddRange(type.GetProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly));

var baseType = type.BaseType;
if (baseType != null)
{
    foreach (var propertyInfo in baseType.GetProperties())
    {
        if (list.All(p => p.Name != propertyInfo.Name))
            list.Add(propertyInfo);
    }
}

如果您打印该列表

foreach (var propertyInfo in list)
    Console.WriteLine($"From {propertyInfo.DeclaringType} > '{propertyInfo.Name}':{propertyInfo.PropertyType}");

你会看到类似的东西:

从 Class2 > 'B':System.Nullable`1[System.Boolean]
从 Class1 > 'A':System.String


推荐阅读