能否用反射比较同元素类型数组?解决反射中元素类型获取问题
基于反射比较数组元素属性的可行方案
完全可以通过反射实现需求,核心是先获取数组元素的原始类型,再基于该类型获取属性进行比较。先修正原代码中的两处错误:
- 数组长度属性是
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
相关产品推荐
相关产品推荐

