2008-11-23 13 views
21

Mi escenario debe ser simple ... el tipo que quiero convertir DE es SIEMPRE 'cadena'. Lo que quiero convertir a ... podría ser muchas cosas - enteros, DateTime, ... cuerdas, etc.¿Cómo puedo convertir tipos en tiempo de ejecución?

Esto sería fácil:

string valueToConvertFrom = "123"; 

int blah = Convert.ToInt32(valueToConvertFrom); 

Sin embargo ... No sé (hasta el tiempo de ejecución) que el valor que necesito convertir es un 'Int' (o lo que sea). He intentado esto:

string valueToConvertFrom = "123"; 

Type convertToType = typeof(int); 

object blah = Convert.ChangeType(valueToConvertFrom, convertToType); 

Pero eso me da el siguiente error: "objeto debe implementar IConvertible."

No quiero tener que hacer una declaración de cambio y llamar "Convert.ToBlah" en función del nombre del tipo ... alguna sugerencia?

+0

favor vuelva a abrir y añadir la respuesta que ha encontrado, por si alguien tiene otra cosa el mismo o un problema similar en el futuro –

+1

La razón por la que cerré esto es porque mi código tenía un error en él ... Inicialmente estaba sacando del campo incorrecto, y ese campo no implementó IConvertible. +1 para ambas respuestas ... "La clase String implementa IConvertible, este código simplemente DEBE funcionar" es cierto. Pero la solución de Asher es genial, ya que aprendí algo nuevo (y es una solución muy limpia). ¡Gracias de nuevo! –

Respuesta

30

la manera más clara de hacerlo es utilizando un TypeConverter. puede obtener una instancia de un convertidor de tipo llamando al TypeDescriptor.GetConverter y luego usando la instancia del convertidor de tipo para hacer la conversión. así que algo como esto:

string valueToConvertFrom = "123"; 

Type convertToType = typeof(int); 

TypeConverter tc = TypeDescriptor.GetConverter(convertToType);    

object blah =tc.ConvertFromString(valueToConvertFrom); 
+0

Esto es brillante. ¡Gracias un montón! – Stephen

+2

La respuesta de Asher no se aplica a Silverlight (web o WP7x), donde TypeDescriptor no está disponible. Además, TypeDescriptor solo devuelve un TypeConverter para un tipo que ha definido un TypeConverter, que no se aplica automáticamente a la mayoría de los tipos. Y el TypeConverter devuelto por TypeDescriptor es solo el primero definido para el tipo dado. Por lo tanto, generalmente no puede confiar en TypeDescriptor para los escenarios de conversión, por decir lo menos. –

+1

Recuerde también que TypeConverter no es solo una clase base abstracta que requiere una implementación personalizada si la usa para la conversión de clases personalizada, sino que también es relativamente más lenta que otros mecanismos, ya que se basa en la reflexión/descubrimiento. –

5

La clase String implementa IConvertible, este código simplemente DEBERÍA funcionar. ¿Qué versión de .NET estás apuntando?

object o = Convert.ChangeType(str, convertToType); 

Además, la mayoría de los tipos que mencionas implementan el método Parse, así que tu mejor opción podría ser algo como esto.

Type convertToType = ...; 
MethodInfo mi = convertToType.GetMethod("Parse", BindingFlags.Static); 
object blah; 
if(mi != null) 
{ 
    blah = mi.Invoke(null, new object[]{valueToConvertFrom}); 
} 
else 
{ 
    // the type doesn't implement the Parse method, handle it another way :/ 
} 
+2

esto parece y se siente como un truco ... – Asher

5

cuestión de Timoteo, tal como se aplica en general a la cuestión de la Conversión de tipos de .NET, es un problema muy grande. Si bien las estrategias de conversión son un tanto sencillas en escenarios específicos con tipos conocidos, desafortunadamente no existe una estrategia generalizada en ninguna implementación de .NET para lograr la conversión de Tipo en tiempo de ejecución de un Tipo arbitrario a otro, ni dicha estrategia será provista por Redmond. Sin embargo, Microsoft proporciona algunas buenas pautas para el concepto general de la conversión de tipo, incluyendo:

que han tenido que hacer frente a la misma cuestión general en mi sistemas, y como solución he consolidado todas las estrategias estándar en un solo método. El alcance de este tema es amplio y las estrategias de conversión relacionadas son variadas, por lo que este enfoque consolidado solo puede ser cubierto en un artículo técnico completo. Sin embargo, ofrezco aquí una copia de la documentación de mi método con la esperanza de que esto lo ayude a comprender los requisitos generales que deberá abordar si desea desarrollar una solución similar y generalizada.Aquí está el enlace a mi documentación:

espero que esto te ayuda,

Marcos

Cuestiones relacionadas