14

我希望能够在仅在运行时知道类型的情况下动态转换一个值。像这样的东西:

myvalue = CType(value, "String, Integer or Boolean")

包含类型值的字符串作为参数传递,也从数据库中读取,值作为字符串存储在数据库中。

这可能吗?

4

5 回答 5

9
 Dim bMyValue As Boolean
 Dim iMyValue As Integer
 Dim sMyValue As String 
 Dim t As Type = myValue.GetType


 Select Case t.Name
     Case "String"
        sMyValue = ctype(myValue, string)
     Case "Boolean"
        bMyValue = ctype(myValue, boolean)
     Case "Integer"
        iMyValue = ctype(myValue, Integer)
 End Select

这有点hacky,但它有效。

于 2008-10-30T20:14:05.193 回答
7

当然可以,但myvalue必须定义为 type Object,你不一定想要这样。也许这是一个由泛型更好地服务的案例。

什么决定了将使用什么类型?

于 2008-10-30T19:49:45.430 回答
5

这是最短的方法。我已经用多种类型对其进行了测试。

Sub DoCast(ByVal something As Object)

    Dim newSomething = Convert.ChangeType(something, something.GetType())

End Sub
于 2008-10-30T20:10:06.200 回答
4

那么,您如何确定需要哪种类型?正如乔尔所说,这可能是泛型的情况。问题是:由于您在编译时不知道类型,因此无论如何都不能处理返回的值,因此在这里强制转换没有意义。

于 2008-10-30T19:52:28.340 回答
2

也许您可以使用反射来代替动态投射某些东西(这似乎不起作用)。获取和调用特定的方法或属性很容易。

Dim t As Type = testObject.GetType()
Dim prop As PropertyInfo = t.GetProperty("propertyName")
Dim gmi As MethodInfo = prop.GetGetMethod()
gmi.Invoke(testObject, Nothing)

它并不漂亮,但您可以在一行中完成其中的一些操作,而不是这么多。

于 2008-10-30T20:03:36.760 回答