考虑以下代码,一个简单的类,带有从 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
的反射或转换“测试”方法,它也将考虑自定义转换?
最佳答案
据我所知,你要找的东西都不存在。对于第一个要求,我能想到的最接近的是 TypeConverter。 .但是,TypeConverter 似乎面向设计人员支持,并且特定于始终是源类型或目标类型的单一类型。
要查找类型的转换方法,您可以创建一个函数来查找具有特殊名称 op_Implicit
和 op_Explicit
(根据 MSDN )的方法具有适当参数和返回类型的源或目标类型。
顺便说一句,IsAssignableFrom
在这种情况下返回 false 的原因是它检查一种类型是否可以直接分配另一种类型的变量而无需 转换。转换运算符使这个问题更加困惑,因为在源代码中,看起来您正在做一个简单的赋值,但实际上您是在调用一个方法并为其赋值。
关于.net - 转换、可分配性和自定义转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8474770/