我正在尝试使用反射在运行时比较两个对象,以使用以下方法遍历其属性:
Private Sub CompareObjects(obj1 As Object, obj2 As Object)
Dim objType1 As Type = obj1.GetType()
Dim propertyInfo = objType1.GetProperties
For Each prop As PropertyInfo In propertyInfo
If prop.GetValue(obj1).Equals(prop.GetValue(obj2)) Then
'Log difference here
End If
Next
End Sub
每当我测试这个方法时,我会在调用prop.GetValue(obj1)时从System.Reflection.RuntimeMethodInfo.InvokeArgumentsCheck中获取参数计数不匹配异常。
无论obj1和obj2的类型,还是prop中的类型(在我的测试用例中,第一个属性是布尔值)都会发生这种情况。
我做错了什么以及如何修复它以便我可以比较两个对象的值?
解决方案
我在for循环中添加了以下几行:
Dim paramInfo = prop.GetIndexParameters
If paramInfo.Count > 0 Then Continue For
第一个属性是一个参数,这导致了问题。现在,我将跳过任何需要参数的属性。
答案 0 :(得分:26)
我怀疑你的类型包含一个索引器 - 即一个带参数的属性。您可以通过调用PropertyInfo.GetIndexParameters
并检查返回的数组是否为空来检查这一点。
(如果不是问题,请编辑您的问题以显示简短但完整的计划,以证明此问题。)
答案 1 :(得分:1)
C#
:
PropertyInfo property = .....
ParameterInfo[] ps = property.GetIndexParameters();
if (ps.Count() > 0)
{
if(obj.ToString().Contains("+"))
{
Debug.Write("object is multi-type");
}
else {
var propValue = property.GetValue(obj, null);
....
}
}
答案 2 :(得分:1)
这对我来说可以跳过索引器。
obj.GetType().GetProperties().Where(x => !x.GetIndexParameters().Any())