c# - 如何忽略使用反射继承的类的所有隐藏属性?
问题描述
我有一个问题,我需要从一个对象中获取所有属性,然后对属性进行排序并将某些属性的值发送到另一个服务。以下是代码示例:
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,所以它对我不起作用。
如果原始属性已被隐藏,我将如何忽略它?
解决方案
如果我理解正确,您需要来自未重新定义的所有属性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);
}
}
如果您打印该列表
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
推荐阅读
- amcharts - 确保显示值标签
- tableau-api - Tableau 禁用自定义视图选项
- shell - 如何迭代文件夹内的所有文件并运行 curl 命令来安装 AEM 包
- javascript - 数据表子行 Hanlde Null 值
- php - 找不到类“条纹\条纹”
- authentication - 如何使用 OpenID Connect 在 API 中获取身份
- algorithm - ArrayBuffer 的二进制搜索
- r - papaja:放置浮动时控制文本间距 H
- c# - 错误:System.InvalidOperationException:未创建会话:Chrome 版本必须在 70 到 73 之间,使用 ChromeDriver 和 Chrome 通过 Selenium
- java - 分页库 - 按键加载特定页面