请考虑以下代码,只是一个具有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的反射或投射“测试”方法,它也会考虑自定义转换?

===============>>#1 票数:2 已采纳

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

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

另外, IsAssignableFrom在这种情况下返回false的原因是它检查是否可以直接为一种类型分配另一种类型的变量而不进行转换。 转换运算符会对此问题造成混淆,因为在源代码 ,您似乎正在进行简单的赋值,但实际上是在调用方法并分配其结果。

===============>>#2 票数:0

根据您尝试使用课程完成的内容,您可能最好使用扩展方法而不是扩展。 您可以在MSDN中获得有关扩展方法的更多信息。

  ask by M.A. Hanin translate from so

未解决问题?本站智能推荐:

1回复

使用System.Type对象在运行时进行投射

我正在尝试创建一个使用DataRow并用数据填充对象的函数。 这是我的代码: 基本上是将列名与属性名匹配,并设置对象的属性值。 直到我击中枚举类型,此方法才有效! 我将一个整数存储在数据库中以获取枚举值,并且我需要能够将其转换回枚举值。 值得一提的是,我也在使用.Ne
1回复

在运行时投射对象

请参见下面的代码: 假设我在应用程序中有一些这样的代码: 我如何在运行时将s变量转换为PostGraduate或Undergraduate,这取决于Student.StudentFactory返回的内容?
3回复

对象列表投射的最佳方法是什么

是否可以提高我的代码的性能? 我认为必须有比“ foreach”更好的方法。 我的对象: 这是我的代码: 谢谢。
1回复

关于“投射”变量的快速建议? 功能非常短,需要调整

我有一些采用这种格式的C ++代码: 但是,assert语句失败。 假设a,b和c均为正值。 然后我认为由于某种原因,“结果”最终变为“结果== 0”。 这里介绍的类型转换逻辑中是否存在某些内在因素导致我的代码失败? 我是C ++的新手,所以答案似乎很明显...
2回复

表达Redis时间的复杂性

Redis的HDEL的时间复杂度为O(N)(其中N是要删除的字段数)。 我有一个用例,其中每个操作的字段都必须经过类型转换。 我将如何表达新的时间复杂性? O(N * 2)?
2回复

reinterpret_cast转换链的正确性

根据类型别名规则 ,我假设: 1) uint64_t*直接转换为uint32_t* - 是不正确的 (我无法通过结果ptr访问数据。并确保我将获得正确的值) 2)转换链是可以的 (我可以安全地访问数据) 我是否正确理解规则? 我总是喜欢使用union来代替,以防止任何可
3回复

C#混淆类层次结构中显式类型转换的必要性

我有两个Vector类和Point类,其中Point是Vector子类。 我有一个针对Vector的Scale方法(因此也针对Point ),还有一个Point的Clone方法,该方法返回深拷贝。 (注意:实际的代码比这更复杂,具有更多的方法,但是此摘录足以说明问题。请不要建议对继承层
1回复

int16_t到int会话可以导致实现定义的行为吗?

在C99标准的第7.18.1.1节第1段中: typedef name intN_t指定一个有符号整数类型,其宽度为N ,没有填充位和二进制补码表示。 根据C99标准,精确宽度有符号整数类型需要具有二进制补码表示。 这意味着,例如, int8_t的最小值为-128 ,而不是一
2回复

是否可以定义指向自动取消引用为特定类型的变化类型的指针?

是否可以定义一个指向未知数字类型的指针(例如int或double ,该指针在解引用时始终返回特定类型(例如double )? 我开始这样做 但是,当然,将int*转换为double*只会为e产生乱码,因为我们将重新解释int的内部位,就好像它们是double格式一样。 我竭尽
1回复

如何解决对重载定义的模糊引用

在我使用的库中有重载方法: put(String key, Integer value) put(String key, Long value) put(String key, Double value) put(String key, Float value)