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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top