如何使CType / DirectCast使用定义的变量而不是直接类型?

时间:2019-05-08 12:38:02

标签: vb.net

我无法使下面的代码正常工作。

错误在最后一行:类型'ChangeType'未定义。

编译器是否认为ChangeType是我没有定义的自定义类型?

我不知道,请给我一个提示。 可能是我看不见树木的森林。

Dim DataValue as String = "True"
Dim ChangeTypeIndex() As String = {"System.Boolean", "System.Char", "System.SByte", "System.Byte", "System.Int16"}
Dim ChangeType As Type = Type.GetType(ChangeTypeIndex(0))
Dim Result = DirectCast(DataValue, ChangeType)

2 个答案:

答案 0 :(得分:1)

不确定您要做什么,但是这里有一些代码可以使用。请注意,我已经更改了数组中的“类型”以包含有效的类型名称。

    Dim DataValue As String = "True"
    Dim ChangeTypeIndex() As String = {"System.Boolean", "System.Char", "System.SByte", "System.Byte", "System.Int16"}
    Dim ChangeType As Type
    For x As Integer = 0 To ChangeTypeIndex.Length - 1
        ChangeType = Type.GetType(ChangeTypeIndex(x), True)
    Next
    ChangeType = Type.GetType(ChangeTypeIndex(0), True)
    Dim Result As Object = CTypeDynamic(DataValue, ChangeType)

答案 1 :(得分:0)

这在VB.NET中是不可能的。 VB.NET是一种类型安全的语言,DirectCast的明确目的是帮助进行编译时类型检查。由于在编译时会分析它的正确性,因此根据定义,不能为它提供类型的变量。 DirectCast仅可用于将对象转换为另一种直接相关的类型(通过继承或实现)。由于DataValueString,因此无论如何{,Boolean都不会继承自String,因此您无法将其转换为Boolean。 {1}}确实允许您传递这样的变量类型。

.NET确实支持反射和后期绑定,因此,如果确实需要,可以执行相同的种类,但是通常最好避免这种情况尽力而为,以确保您从编译器的类型检查安全措施中获得最大收益。

除了警告,如果您确实需要这样做,则近似近似如下:

DirectCast