2008-10-30 17 views
14

Me gustaría poder emitir un valor dinámicamente cuando el tipo se conoce solo en tiempo de ejecución. Algo como esto:Fundición en VB.NET

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

La cadena que contiene el valor tipo se pasa como argumento y también se lee de una base de datos, y el valor se almacena como cadena en la base de datos.

¿Esto es posible?

Respuesta

7

Claro, pero myvalue tendrá que definirse como del tipo Object, y no necesariamente quiere eso. Tal vez este sea un caso mejor atendido por los genéricos.

¿Qué determina qué tipo se utilizará?

+0

solo una cadena que indica el tipo "Cadena", "entero", "booleano" – Youssef

+0

Entonces, ¿qué establece la cadena? –

+0

la cadena se pasa como argumento – Youssef

4

Bueno, ¿cómo se determina qué tipo se requiere? Como dijo Joel, este es probablemente un caso para los genéricos. La cuestión es que, dado que no se conoce el tipo en el momento de la compilación, no se puede tratar el valor devuelto de todos modos, por lo que el fundido realmente no tiene sentido aquí.

2

Quizás en lugar de lanzar dinámicamente algo (que no parece funcionar) podría utilizar el reflejo 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 podría hacer algo de eso en una línea en lugar de tantas.

5

Esta es la forma más rápida de hacerlo. Lo he probado con varios tipos.

Sub DoCast(ByVal something As Object) 

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

End Sub 
9
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 hacky, pero funciona.