我希望能够在仅在运行时知道类型的情况下动态转换一个值。像这样的东西:
myvalue = CType(value, "String, Integer or Boolean")
包含类型值的字符串作为参数传递,也从数据库中读取,值作为字符串存储在数据库中。
这可能吗?
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,但它有效。
当然可以,但myvalue
必须定义为 type Object
,你不一定想要这样。也许这是一个由泛型更好地服务的案例。
什么决定了将使用什么类型?
这是最短的方法。我已经用多种类型对其进行了测试。
Sub DoCast(ByVal something As Object)
Dim newSomething = Convert.ChangeType(something, something.GetType())
End Sub
那么,您如何确定需要哪种类型?正如乔尔所说,这可能是泛型的情况。问题是:由于您在编译时不知道类型,因此无论如何都不能处理返回的值,因此在这里强制转换没有意义。
也许您可以使用反射来代替动态投射某些东西(这似乎不起作用)。获取和调用特定的方法或属性很容易。
Dim t As Type = testObject.GetType()
Dim prop As PropertyInfo = t.GetProperty("propertyName")
Dim gmi As MethodInfo = prop.GetGetMethod()
gmi.Invoke(testObject, Nothing)
它并不漂亮,但您可以在一行中完成其中的一些操作,而不是这么多。