2011-12-12 21 views
3

请考虑以下代码,只是一个具有从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

据我所知,你所寻找的东西都不存在。我能想到的最接近的第一个要求是TypeConverter。但是,TypeConverters似乎适用于设计器支持,并且特定于始终是源或目标类型的单个类型。

要找到一个类型的转换方法,你可以做一个函数来查找与源或目标类型的特殊名称op_Implicitop_Explicit(按MSDN)用适当的参数的方法和返回类型。

作为题外话,原因在这种情况下IsAssignableFrom返回false是,它会检查是否一个类型可以是分配另一种类型的可变直接而不转换。转换操作员为此问题添加了混淆,因为在源代码中,它出现,您正在做一个简单的分配,但实际上是调用一个方法并分配其结果。

0

根据你正在试图用你的班级完成什么,你最好使用扩展方法而不是扩展。您可以从Extension Methods in MSDN获取更多信息。