【问题标题】:Casting, Assignability and custom conversions投射、可分配性和自定义转换
【发布时间】:2012-01-18 11:22:15
【问题描述】:

考虑以下代码,它只是一个从 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 的反射或强制转换“测试”方法也可以解释自定义转换?

【问题讨论】:

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


    【解决方案1】:

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

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

    顺便说一句,IsAssignableFrom 在这种情况下返回 false 的原因是它检查一种类型是否可以分配直接转换另一种类型的变量。转换运算符给这个问题带来了混乱,因为在源代码中看起来你正在做一个简单的赋值,但实际上你是在调用一个方法并赋值它的结果。

    【讨论】:

      【解决方案2】:

      根据您试图用您的课程完成的具体内容,您最好使用扩展方法而不是扩展方法。您可以通过Extension Methods in MSDN获取更多信息。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-11-30
        • 2015-05-09
        • 2011-06-17
        • 2014-06-06
        • 2012-09-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多