2013-03-06 93 views
9

在VB.NET中,CType可用于将一种类型转换为另一种类型。VB.NET中的CType具有动态第二个参数(类型)

CType(expression,type) 

我有存储在实例对象类中的“表达式”,如"objExp"。 我有存储在Type类的实例中的“类型”,比如"objType"

我正在尝试CType(objExp, objType) 我收到编译错误,该怎么办?在运行时提取并分配“objType”。

+0

'CType'是用来告诉编译器,其类型,其目的在于,所以'expression'和'type'必须是已知的**在编译时**。但是,你会得到什么错误? – 2013-03-06 16:08:44

+0

如果直到运行时才知道结果,那么你会存储结果吗?对于这种转换,您可以简单地依赖** System.Convert.ChangeType **。这是另一个XY问题吗? – 2013-03-06 16:09:10

+0

@TimSchmelter,错误是“类型'objType'未定义” – Brij 2013-03-06 16:12:24

回答

1

这根本不可能。该CType表达必须通过一个Type实例,它是在像IntegerString等编译时已知...它不接受它的类型是Type

0

的值如果没有意义投对象的变量类型(在编译时未知的类型)。铸造的重点是指定确切的类型。不过,我怀疑,而不是使用Type对象,你真正需要的是泛型方法或泛型类。例如:

Public Function DoSomethingGenerically(Of T)(MyParameter As MyType) As T 
    Return CType(MyParameter.MyProperty, T) 
End Function 

这是一个非常没有意义的方法,因为它是所有投的财产,并返回它作为类型,但它显示了如何转换为类型T不知道是什么,具体而言,T恰巧是。然后,你可以这样调用它:

Dim x As New MyType() 
Dim y As MyType2 = DoSomethingGenerically(Of MyType2)(x) 

这正是如何List(Of T)类,以及其他类似的泛型类实现。除了的,而不是让一个单独的方法一般,他们让全班通用的,比如:

Public Class MyList(Of T) 
    Public Sub Add(item As T) 
     ' ... 
    End Sub 
End Class 
+0

这与CType(x,MyType2)主要有何不同?更多的打字 - 相同的结果。在泛型和CType中都必须在编译时知道类型。 – Neolisk 2014-02-09 22:52:14

+1

@Neilisk,即使在编译时,你是正确的,类型必须为泛型类型所知,但类型是由调用者而不是泛型方法本身指定的。正如我在答案中所说的,我展示的示例方法是毫无意义的。它仅仅是为了演示泛型类型如何工作。 – 2014-02-09 23:01:18

16

你查的方法CTypeDynamic()?第二个参数(即:类型)可以动态设置。当你使用反射时非常有用。

例如:

CTypeDynamic(strValueToConvert, objTypeToConvertTo) 
+1

这个答案适合我。这不是最好的答案? – Arvin 2014-06-13 08:50:26

+1

那么,出于某种原因,'CTypeDynamic'的返回类型是'Object',这是不幸的,但显然是不可避免的。 – 2014-10-10 15:50:16

+0

完美的作品! – HumbleBeginnings 2016-01-27 22:38:44