C#如何通过反射搭配BindingFlags获取带get访问器的公共属性
问题原因&解决方法
错误点分析
- 你当前代码的核心问题是使用了按位与
&组合BindingFlags枚举值:BindingFlags属于[Flags]特性标记的标志枚举,多个枚举值组合时必须使用按位或|,用&计算会得到数值为0的结果,自然匹配不到任何属性。 - 其次
BindingFlags.GetProperty是用于InvokeMember这类成员调用场景的标志,GetProperties方法查询属性时不需要传入该值。
正确实现代码
你的需求是匹配所有公共实例属性中存在get访问器的项(无论是否有set访问器),可以按如下方式实现:
// 第一步:获取所有公共的实例属性 var allPublicInstanceProps = obj.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance); // 第二步:过滤出带有get访问器的属性,符合"仅get"或"get+set都存在"的要求 var targetProperties = allPublicInstanceProps.Where(prop => prop.GetMethod != null).ToList();
如果你需要额外过滤只保留只有get访问器的只读属性,可以把过滤条件修改为:
var readOnlyProps = allPublicInstanceProps.Where(prop => prop.GetMethod != null && prop.SetMethod == null).ToList();
内容的提问来源于stack exchange,提问作者Neeraj Kumar Gupta
相关产品推荐
相关产品推荐

