如何在FastMember中跳过索引器属性?
解决方案
FastMember的Member类型本身确实没有直接提供判断是否为索引器的属性,但可以借助其UnderlyingMember属性结合反射来实现过滤:
修改你的代码如下:
TypeAccessor accessor = TypeAccessor.Create(type); return accessor.GetMembers() .Where(m => m.CanRead) .Where(m => { // 区分属性和字段,仅过滤掉索引器属性 if (m.UnderlyingMember is PropertyInfo prop) { // 索引器属性会有参数,GetIndexParameters返回长度大于0 return prop.GetIndexParameters().Length == 0; } // 字段不会是索引器,直接保留 return true; }) .Select(m => accessor[item, m.Name]);
原理说明
索引器在.NET中本质是带参数的属性,通过反射获取属性的GetIndexParameters()方法,若返回的参数数组长度大于0,就说明这是一个索引器。而Member.UnderlyingMember可以拿到该成员对应的反射对象(PropertyInfo或FieldInfo),借此就能完成判断。
如果你的场景需要频繁处理同类型的成员,建议把过滤后的成员列表缓存起来,避免重复的反射操作影响性能。
内容的提问来源于stack exchange,提问作者nawfal
相关产品推荐
相关产品推荐

