.net - 转换、可分配性和自定义转换

标签 .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 的反射或转换“测试”方法,它也将考虑自定义转换?

最佳答案

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

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

顺便说一句,IsAssignableFrom 在这种情况下返回 false 的原因是它检查一种类型是否可以直接分配另一种类型的变量而无需 转换。转换运算符使这个问题更加困惑,因为在源代码中,看起来您正在做一个简单的赋值,但实际上您是在调用一个方法并为其赋值。

关于.net - 转换、可分配性和自定义转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8474770/

相关文章:

c# - 从url获取正确的下载文件大小

c# - 如何通过进程 ID 而不是窗口句柄向特定进程发送消息?

c# - 在 .Net C# 中将 MS word 文件转换为图像

asp.net - .Except<T> 抛出异常

wpf - 如何在 XAML 中绑定(bind)多个 ObservableCollection

c++ - 具有默认构造函数的模板类中的模板化转换运算符?

c# - 如何防止 WinForm 控件拉伸(stretch)并保持固定大小

javascript 和 VB.net 返回不正确的结果

c# - 以下数字赋值是否会导致 C# 中的隐式强制转换?

types - 如何将 Elixir 元组转换为位串?