Подтвердить что ты не робот

Недопустимое несоответствие параметра при вызове 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

Первое свойство принимало параметр, который вызывал проблему. На данный момент я просто пропущу любое свойство, требующее параметр.

4b9b3361

Ответ 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);
    ....
  }
}