List (из Int32) .Contains ([значение int64]) не работает из-за разнотипных типов - PullRequest
1 голос
/ 07 марта 2012

У меня есть список целых чисел, которые были десериализованы WCF из json. Этот список десериализуется как список (из int32). Я не имею никакого контроля над тем, как он десериализуется.

Мне нужно иметь возможность увидеть, содержит ли этот список значение, которое оказывается Int64. Это очевидно не работает. Вот пример функции:

Private Shared Function IsIn(aPropertyValue As Int64, aList As IList) As Boolean
    Return aList.Contains(aPropertyValue)
End Function

Причина, по которой я передаю IList, заключается в том, что я не хочу создавать эту функцию 12 раз, по одному разу для каждого числового типа, байтов через uint64. Если бы я создавал его 12 раз, то есть по 12 х 12 раз для каждого возможного варианта, я бы мог использовать List (of T) .Exists ().

В документации к Contains () говорится, что для сравнения используется IEquatable (Of T) .Equals. Я должен думать, что Int32 и Int64 с одинаковым значением можно сравнить и найти равными.

Я, должно быть, упускаю что-то очевидное.

1 Ответ

0 голосов
/ 27 апреля 2012

Попробуйте это:

Private Function IsIn(ByVal aPropertyValue As Long, ByVal list As IList) As Boolean
    Dim genericListType As Type = CType(list, Object).GetType().GetGenericArguments()(0)
    Dim convertedPropertyValue As Object = Nothing
    Try
        convertedPropertyValue = Convert.ChangeType(aPropertyValue, genericListType)
    Catch
    End Try
    If convertedPropertyValue IsNot Nothing Then
        Return list.Contains(convertedPropertyValue)
    Else
        Return False
    End If
End Function
...