Pregunta
Me gustaría poder emitir un valor dinámicamente donde el tipo se conoce solo en tiempo de ejecución. Algo como esto:
myvalue = CType(value, "String, Integer or Boolean")
La cadena que contiene el valor de tipo se pasa como un argumento y también se lee desde una base de datos, y el valor se almacena como una cadena en la base de datos.
¿Es esto posible?
Solución
Claro, pero myvalue
tendrá que definirse como de tipo Object
, y no necesariamente desea eso. Quizás este sea un caso mejor servido por los genéricos.
¿Qué determina qué tipo se utilizará?
Otros consejos
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
Es un poco pirateado pero funciona.
Esta es la forma más corta de hacerlo. Lo he probado con múltiples tipos.
Sub DoCast(ByVal something As Object)
Dim newSomething = Convert.ChangeType(something, something.GetType())
End Sub
Bueno, ¿cómo determinas qué tipo se requiere? Como dijo Joel, este es probablemente un caso para los genéricos. El problema es que, dado que no conoces el tipo en el momento de la compilación, no puedes tratar el valor devuelto de todos modos, por lo que la conversión no tiene sentido aquí.
Tal vez en lugar de lanzar dinámicamente algo (que no parece funcionar) podría usar la reflexión en su lugar. Es bastante fácil obtener e invocar métodos o propiedades específicos.
Dim t As Type = testObject.GetType()
Dim prop As PropertyInfo = t.GetProperty("propertyName")
Dim gmi As MethodInfo = prop.GetGetMethod()
gmi.Invoke(testObject, Nothing)
No es bonito, pero puedes hacer algo de eso en una línea en lugar de tantas.