使用Array.IndexOf查找PropertyInfo数组索引返回-1求助
为什么Array.IndexOf无法在PropertyInfo数组中找到属性名?
你踩了一个很常见的类型匹配误区——Array.IndexOf是在数组里寻找和你传入参数完全相等的元素,而不是元素的某个属性值等于参数。
咱们拆解一下你的代码:
- 你的
propInfo数组里装的是PropertyInfo对象,每个对象代表MyClass的一个属性。 - 你调用
Array.IndexOf(propInfo, "name")时,是在问:这个数组里有没有哪个元素就是字符串"name"?显然没有,数组里全是PropertyInfo对象,和字符串类型完全不搭,所以返回-1是完全正确的结果。
而你测试propInfo[0].Name.Equals("name")返回true,是因为你在比较PropertyInfo对象的Name属性(这是个字符串)和"name",这才是正确的字符串相等比较——你不是在比较对象本身,而是对象的属性值。
给你几个可行的解决方案:
1. 用LINQ直接定位目标PropertyInfo(最简洁推荐)
using System.Linq; // 记得添加这个命名空间引用 public void test() { PropertyInfo[] propInfo = typeof(MyClass).GetProperties(); MyClass objMC = new MyClass(); var nameProperty = propInfo.FirstOrDefault(p => p.Name == "name"); if (nameProperty != null) { var propertyValue = nameProperty.GetValue(objMC)?.ToString().Trim(); if (propertyValue == "zeal") { // matched } else { // not matched } } }
2. 手动遍历数组找索引(不用LINQ的场景)
public void test() { PropertyInfo[] propInfo = typeof(MyClass).GetProperties(); MyClass objMC = new MyClass(); int nameIndex = -1; for (int i = 0; i < propInfo.Length; i++) { if (propInfo[i].Name == "name") { nameIndex = i; break; } } if (nameIndex != -1) { var value = propInfo[nameIndex].GetValue(objMC)?.ToString().Trim(); if (value == "zeal") { // matched } else { // not matched } } }
3. 用Array.FindIndex替代IndexOf(更适合自定义匹配逻辑)
如果一定要用数组自带的方法,Array.FindIndex可以接受一个匹配条件,比IndexOf灵活得多:
public void test() { PropertyInfo[] propInfo = typeof(MyClass).GetProperties(); MyClass objMC = new MyClass(); int nameIndex = Array.FindIndex(propInfo, p => p.Name == "name"); if (nameIndex != -1) { var value = propInfo[nameIndex].GetValue(objMC)?.ToString().Trim(); if (value == "zeal") { // matched } else { // not matched } } }
核心记住:以后用数组查找方法时,先搞清楚你是要找某个对象本身,还是找具有某个属性值的对象——这两者的实现逻辑完全不同。
内容的提问来源于stack exchange,提问作者zeal
相关产品推荐
相关产品推荐

