Кастинг, Назначение и пользовательские преобразования - PullRequest
3 голосов
/ 12 декабря 2011

Рассмотрим следующий код, просто класс с настраиваемым расширяющим преобразованием из Long (Int64).

Public Class CharacterArgs
    Private _CharacterID As Long

    Public ReadOnly Property CharacterID() As Long
        Get
            Return _CharacterID
        End Get
    End Property

    Public Sub New(ByVal characterID As Long)
        _CharacterID = characterID
    End Sub

    Public Sub New()

    End Sub

    Overloads Shared Widening Operator CType(ByVal source As Long) As CharacterArgs
        Return New CharacterArgs(source)
    End Operator

End Class

Работает следующий код:

Dim test As CharacterArgs
test = 10

Но:

Dim canAssign = GetType(CharacterArgs).IsAssignableFrom(GetType(Long)) 'False
Dim convertTest = Convert.ChangeType(10L, GetType(CharacterArgs))
'Throws InvalidCastException

Итак, мои вопросы:

  1. Существует ли метод приведения / преобразования, который поддерживает пользовательское преобразование, но также принимает целевой тип как объект System.Type (в отличие от CType)?
  2. Существует ли метод "отражения" отражения или приведения типа, аналогичный IsAssignableFrom, который также учитывает пользовательское преобразование?

Ответы [ 2 ]

2 голосов
/ 12 декабря 2011

Насколько я знаю, ничего из того, что вы ищете, не существует. Наиболее близким, что я могу придумать для первого требования, будет TypeConverter . Однако TypeConverters, похоже, ориентированы на поддержку дизайнера и относятся только к одному типу, который всегда будет типом источника или назначения.

Чтобы найти методы преобразования для типа, вы можете создать функцию для поиска методов со специальными именами op_Implicit и op_Explicit (согласно MSDN ) в типах источника или назначения с соответствующими аргументами и возвращаемыми типами.

Кроме того, причина, по которой IsAssignableFrom возвращает false в этом случае, заключается в том, что он проверяет, может ли один тип быть назначенным переменной другого типа напрямую без преобразований. Операторы преобразования добавляют путаницу к этой проблеме, потому что в исходном коде появляется , что вы делаете простое присваивание, но вы фактически вызываете метод и присваиваете его результат.

0 голосов
/ 13 декабря 2011

В зависимости от того, что именно вы пытаетесь достичь с помощью вашего класса, вам может быть лучше использовать методы расширения, а не расширение.Вы можете получить больше информации о методах расширения в MSDN .

...