C# 如何忽略使用反射继承的类的所有隐藏属性?

C# 如何忽略使用反射继承的类的所有隐藏属性?,c#,system.reflection,C#,System.reflection,我遇到一个问题,我需要从一个对象获取所有属性,然后对属性进行排序,并将某些属性的值发送到另一个服务。下面是一个代码示例: 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

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

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和Class1中的B。这导致了我的问题,因为当循环通过每个属性时,我将发送B两次,一个默认值为false,因为它从未设置过,另一个默认值为我的服务设置的正确值。我需要结果包含Class2中的B、Class1中的A和Class2中的C,但忽略Class1中的B,因为它已被新关键字隐藏

我试着查看我可以使用的绑定标志,但没有帮助。我能找到的最接近的标志是BindingFlags.DeclaredOnly标志,但它将A从Class1中排除,因此它对我不起作用


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

您可以使用LINQ查询来过滤隐藏的属性

var allProps = typeof(Class2).GetProperties(
        BindingFlags.Instance | BindingFlags.Public
);

var thePropsYouWant = 
        from p in allProps
        group p by p.Name into g
        select g.OrderByDescending(t => t.DeclaringType == typeof(Class2)).First();

看到它在这里运行:

如果我理解正确,您需要
Class2
中的所有属性以及
Class1
中未在
Class2
中重新定义的所有属性

您可以通过两次调用
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);
    }
}
您将看到如下内容:

来自Class2>“B”:System.Nullable`1[System.Boolean]
来自Class1>“A”:System.String


一个简单的基于LINQ的解决方案,以通用方式适用于所有类层次结构:

   var propertiesWithoutHiddenOnes = GetProperties(objectToUpdate.GetType())
            .GroupBy(prop => prop.Name)
            .Select(group => group.Aggregate(
                     (mostSpecificProp, other) => mostSpecificProp.DeclaringType.IsSubclassOf(other.DeclaringType) ? mostSpecificProp : other))

你能告诉我们到目前为止你尝试了什么吗?为什么你需要一个隐藏另一个的属性?这不是一个很好的实践。您是否只对获取基类的成员感兴趣?如果class2有一个boolc,你也会想要它吗?你的代码将无法编译并且似乎无法正常工作。您测试了吗?这(在您修复编译错误之后)将只返回一个属性(来自类2)。看起来OP需要Class1中的
A
属性和Class2Hmm中的B属性。我错过了OP需要Class1中大多数属性的例子。@AleksAndreev是正确的,我不能使用绑定标志,因为它会将A从Class1中排除。此外,这只是一个示例代码,没有测试也没有编译它。我不确定我所问的是否可能,只是花了几天的时间寻找并认为我在这里发布了我的代码,作为最后的标准,我修改了我的代码以实际编译和“工作”。我将删除这个答案,再仔细考虑一下。
   var propertiesWithoutHiddenOnes = GetProperties(objectToUpdate.GetType())
            .GroupBy(prop => prop.Name)
            .Select(group => group.Aggregate(
                     (mostSpecificProp, other) => mostSpecificProp.DeclaringType.IsSubclassOf(other.DeclaringType) ? mostSpecificProp : other))