Недопустимое несоответствие параметра при вызове PropertyInfo.GetValue
Я пытаюсь сравнить два объекта во время выполнения, используя отражение, чтобы перебрать их свойства, используя следующий метод:
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
Всякий раз, когда я тестирую этот метод, я получаю исключение несоответствия счетчика параметров из System.Reflection.RuntimeMethodInfo.InvokeArgumentsCheck, когда он вызывает prop.GetValue(obj1).
Это происходит независимо от типа obj1 и obj2, а также типа в prop (в моем тестовом случае первое свойство является булевым).
Что я делаю неправильно и как его исправить, чтобы я мог сравнивать значения с двумя объектами?
Решение
Я добавил следующие строки внутри каждого цикла:
Dim paramInfo = prop.GetIndexParameters
If paramInfo.Count > 0 Then Continue For
Первое свойство принимало параметр, который вызывал проблему. На данный момент я просто пропущу любое свойство, требующее параметр.
Ответы
Ответ 1
Я подозреваю, что ваш тип содержит указатель, т.е. свойство, которое принимает параметры. Вы можете проверить это, вызвав PropertyInfo.GetIndexParameters
и проверить, не вернулся ли возвращенный массив.
(Если это не проблема, отредактируйте свой вопрос, чтобы показать короткую, но полную программу, демонстрирующую проблему.)
Ответ 2
для 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);
....
}
}