投射,可转让性和自定义转化

时间:2011-12-12 13:05:10

标签: .net vb.net casting type-conversion

考虑以下代码,只是一个从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 个答案:

答案 0 :(得分:2)

据我所知,你所寻找的事物都不存在。对于第一个要求,我能想到的最接近的是TypeConverter。但是,TypeConverters似乎面向设计人员支持,并且特定于单一类型,它始终是源类型或目标类型。

要查找某个类型的转换方法,您可以创建一个函数,在源代码中查找具有特殊名称op_Implicitop_Explicit(根据MSDN)的方法。具有适当参数和返回类型的目标类型。

顺便说一下,IsAssignableFrom在这种情况下返回false的原因是它检查一个类型是否可以直接分配另一个类型的变量而不用转换。转换运算符会对此问题造成混淆,因为在源代码中出现您正在进行简单的赋值,但实际上是在调用方法并分配其结果。

答案 1 :(得分:0)

根据您尝试使用课程完成的内容,您可能最好使用扩展方法而不是扩展。您可以在Extension Methods in MSDN上获得更多信息。