Кастинг в VB.NET

Я хотел бы иметь возможность динамически вводить значение, когда тип известен только во время выполнения. Что-то вроде этого:

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

Строка, содержащая значение типа, передается в качестве аргумента и также считывается из базы данных, а значение сохраняется в виде строки в базе данных.

Возможно ли это?

Ответы

Ответ 1

Конечно, но myvalue должен быть определен как тип Object, и вы не обязательно этого хотите. Возможно, в этом случае лучше всего обслуживать дженерики.

Что определяет, какой тип будет использоваться?

Ответ 2

 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

Это немного хакерский, но он работает.

Ответ 3

Это самый короткий способ сделать это. Я тестировал его с несколькими типами.

Sub DoCast(ByVal something As Object)

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

End Sub

Ответ 4

Ну, как вы определяете, какой тип требуется? Как сказал Джоэл, это, вероятно, случай для дженериков. Дело в том, что, поскольку вы не знаете тип во время компиляции, вы никак не можете обработать возвращаемое значение, поэтому кастинг здесь действительно не имеет смысла.

Ответ 5

Возможно, вместо того, чтобы динамически бросать что-то (что, похоже, не работает), вы можете использовать отражение вместо этого. Достаточно легко получить и вызвать специальные методы или свойства.

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

Это не очень хорошо, но вы можете сделать некоторые из них в одной строке, а не столько.