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

能否用反射比较同元素类型数组?解决反射中元素类型获取问题

基于反射比较数组元素属性的可行方案

完全可以通过反射实现需求,核心是先获取数组元素的原始类型,再基于该类型获取属性进行比较。先修正原代码中的两处错误:

  • 数组长度属性是Length(原代码拼写为Lenght)
  • arrayA是object类型,需先转为Array类型才能调用GetValue方法

完整实现代码

Test a = new Test();
Test b = new Test();

// 填充数据示例
a.ArrayA = new[] { new A { P1 = "test1", P2 = 1 }, new A { P1 = "test2", P2 = 2 } };
b.ArrayA = new[] { new A { P1 = "test1", P2 = 1 }, new A { P1 = "test3", P2 = 2 } };

var props = typeof(Test).GetProperties();

foreach (var prop in props)
{
    // 获取数组对象并转为Array类型
    Array arrayA = (Array)prop.GetValue(a);
    Array arrayB = (Array)prop.GetValue(b);

    // 获取数组元素的原始类型(此处为A类型)
    Type elementType = arrayA.GetType().GetElementType();
    // 获取元素类型的所有属性
    PropertyInfo[] elementProps = elementType.GetProperties();

    for (int i = 0; i < arrayA.Length; i++)
    {
        var item1 = arrayA.GetValue(i);
        var item2 = arrayB.GetValue(i);

        // 遍历元素的每个属性进行比较
        foreach (var elemProp in elementProps)
        {
            object value1 = elemProp.GetValue(item1);
            object value2 = elemProp.GetValue(item2);

            // 执行比较逻辑,示例中直接输出比较结果
            bool isEqual = Equals(value1, value2);
            Console.WriteLine($"数组索引{i},属性{elemProp.Name}:{(isEqual ? "相等" : "不相等")}");
        }
    }
}

关键步骤说明

  • 获取数组元素类型:通过arrayA.GetType().GetElementType()可以拿到数组中元素的实际类型(比如这里的A),而非object。
  • 获取元素属性:基于元素类型调用GetProperties(),就能拿到P1、P2这些属性的PropertyInfo对象。
  • 属性值比较:用elemProp.GetValue(item1)和elemProp.GetValue(item2)分别取出两个对象的属性值,再用Equals或自定义逻辑比较即可。

内容的提问来源于stack exchange,提问作者Shao Skywalker

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 13:53:13