You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:30:16