Reputation: 273
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.
Upvotes: 24
Views: 13186
Reputation: 982
This was plenty for me to skip over indexers.
obj.GetType().GetProperties().Where(x => !x.GetIndexParameters().Any())
Upvotes: 6
Reputation: 56439
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);
....
}
}
Upvotes: 1
Reputation: 1501163
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.)
Upvotes: 35