2013-09-10 2 views
11

Я пытаюсь сравнить два объекта во время выполнения, используя отражение в цикле через их свойства, используя следующий метод:Параметр Count несовпадение исключение при вызове 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.InvokeArgumentsПроверьте, когда он вызывает prop.GetValue (obj1).

Это происходит независимо от типа obj1 и obj2, а также типа в prop (в моем тестовом примере первое свойство является булевым).

Что я делаю неправильно и как я могу исправить это, чтобы сравнить значения из двух объектов?

Решение

Я добавил следующие строки только внутри для каждого цикла:

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

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

ответ

22

Я подозреваю, что ваш тип содержит указатель, т. Е. Свойство, которое принимает параметры. Вы можете проверить это, вызвав PropertyInfo.GetIndexParameters и проверить, не вернулся ли возвращенный массив.

(Если не проблемы, пожалуйста, измените ваш вопрос, чтобы показать короткий, но полной программы демонстрирует эту проблему.)

+0

Спасибо, что вы право, собственность принимала в bool, что я не проходил. –

0

для 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); 
    .... 
    } 
} 
Смежные вопросы