gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 00:27:01 25 4
gpt4 key购买 nike

考虑以下代码,一个简单的类,带有从 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com