考虑以下代码,只是一个从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
所以我的问题:
System.Type
对象(而不是CType
)?IsAssignableFrom
的反射或投射“测试”方法,它也会考虑自定义转换?答案 0 :(得分:2)
据我所知,你所寻找的事物都不存在。对于第一个要求,我能想到的最接近的是TypeConverter。但是,TypeConverters似乎面向设计人员支持,并且特定于单一类型,它始终是源类型或目标类型。
要查找某个类型的转换方法,您可以创建一个函数,在源代码中查找具有特殊名称op_Implicit
和op_Explicit
(根据MSDN)的方法。具有适当参数和返回类型的目标类型。
顺便说一下,IsAssignableFrom
在这种情况下返回false的原因是它检查一个类型是否可以直接分配另一个类型的变量而不用转换。转换运算符会对此问题造成混淆,因为在源代码中出现您正在进行简单的赋值,但实际上是在调用方法并分配其结果。
答案 1 :(得分:0)
根据您尝试使用课程完成的内容,您可能最好使用扩展方法而不是扩展。您可以在Extension Methods in MSDN上获得更多信息。