Ответ 1
Конечно, но myvalue
должен быть определен как тип Object
, и вы не обязательно этого хотите. Возможно, в этом случае лучше всего обслуживать дженерики.
Что определяет, какой тип будет использоваться?
Я хотел бы иметь возможность динамически вводить значение, когда тип известен только во время выполнения. Что-то вроде этого:
myvalue = CType(value, "String, Integer or Boolean")
Строка, содержащая значение типа, передается в качестве аргумента и также считывается из базы данных, а значение сохраняется в виде строки в базе данных.
Возможно ли это?
Конечно, но myvalue
должен быть определен как тип Object
, и вы не обязательно этого хотите. Возможно, в этом случае лучше всего обслуживать дженерики.
Что определяет, какой тип будет использоваться?
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
Это немного хакерский, но он работает.
Это самый короткий способ сделать это. Я тестировал его с несколькими типами.
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)
Это не очень хорошо, но вы можете сделать некоторые из них в одной строке, а не столько.