21

我正在尝试使用反射在运行时比较两个对象,以使用以下方法循环它们的属性:

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 each 循环中添加了以下几行:

Dim paramInfo = prop.GetIndexParameters
If paramInfo.Count > 0 Then Continue For

第一个属性采用了导致问题的参数。现在,我将跳过任何需要参数的属性。

4

3 回答 3

31

我怀疑您的类型包含一个索引器 - 即一个带有参数的属性。您可以通过调用PropertyInfo.GetIndexParameters并检查返回的数组是否为空来检查这一点。

(如果这不是问题,请编辑您的问题以显示一个简短但完整的程序来演示该问题。)

于 2013-09-10T14:44:27.673 回答
3

这对我来说已经足够跳过索引器了。

obj.GetType().GetProperties().Where(x => !x.GetIndexParameters().Any())
于 2018-07-19T10:35:58.247 回答
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);
    ....
  }
}
于 2018-02-19T17:31:27.260 回答