Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Parameter Count Mismatch exception when calling PropertyInfo.GetValue

I'm trying to compare two objects at runtime using reflection to loop through their properties using the following method:

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

Whenever I test this method, I'm getting a Parameter Count Mismatch exception from System.Reflection.RuntimeMethodInfo.InvokeArgumentsCheck when it calls prop.GetValue(obj1).

This happens no matter the type of obj1 and obj2, nor the type in prop (in my test case, the first property is a Boolean).

What am I doing wrong and how can I fix it so that I can compare the values from the two objects?

Solution

I added the following lines just inside the for each loop:

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

The first property was taking a parameter, which was causing the problem. For now, I'll just skip any property that requires a parameter.

like image 411
Charles H. Avatar asked Sep 10 '13 14:09

Charles H.


3 Answers

I suspect your type contains an indexer - i.e. a property which takes parameters. You can check for this by calling PropertyInfo.GetIndexParameters and checking if the returned array is empty.

(If that isn't the problem, please edit your question to show a short but complete program demonstrating the issue.)

like image 69
Jon Skeet Avatar answered Oct 18 '22 18:10

Jon Skeet


This was plenty for me to skip over indexers.

obj.GetType().GetProperties().Where(x => !x.GetIndexParameters().Any())
like image 4
Billy Jake O'Connor Avatar answered Oct 18 '22 18:10

Billy Jake O'Connor


for 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);
    ....
  }
}
like image 1
T.Todua Avatar answered Oct 18 '22 18:10

T.Todua