Pregunta

Mi escenario debería ser simple ... el tipo que quiero convertir DE es SIEMPRE 'cadena'. Lo que quiero convertir a ... podría ser muchas cosas: ints, DateTimes, ... cadenas, etc.

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 al 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: " El objeto debe implementar IConvertible. "

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

¿Fue útil?

Solución

la manera limpia de hacerlo es usar un TypeConverter. puede obtener una instancia de un convertidor de tipos llamando al TypeDescriptor .GetConverter y luego usando la instancia del convertidor de tipos para hacer la conversión. entonces algo como esto:

string valueToConvertFrom = "123";

Type convertToType = typeof(int);

TypeConverter tc =  TypeDescriptor.GetConverter(convertToType);             

object blah =tc.ConvertFromString(valueToConvertFrom);

Otros consejos

La clase de cadena implementa IConvertible, este código simplemente DEBE funcionar. ¿Qué versión de .NET buscas?

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

Además, la mayoría de los tipos que mencionaste implementan el método Parse, por lo 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 :/
}

La pregunta de Timothy, tal como se aplica generalmente a la cuestión de la conversión de tipos en .NET, es un problema muy grande. Si bien las estrategias de conversión son algo 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 tipos en tiempo de ejecución de un tipo arbitrario a otro, ni tampoco es una estrategia de Redmond. Sin embargo, Microsoft proporciona algunas buenas pautas para el concepto general de conversión de tipos, que incluyen:

He tenido que lidiar con el mismo problema general en mis sistemas y, como solución, he consolidado todas las estrategias estándar en un solo método. El alcance de este problema es amplio y las estrategias de conversión relacionadas son variadas, por lo que este enfoque consolidado solo puede tratarse 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 le ayude a comprender con firmeza los requisitos generales que deberá abordar si desea desarrollar una solución general similar. Aquí está el enlace a mi documentación:

Espero que esto te ayude,

Marcar

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