Convertir una variable usando una variable de tipo
¿En C# puedo convertir una variable de tipo object
a una variable de tipo T
donde T
está definida en una Type
variable?
A continuación se muestra un ejemplo de conversión y conversión:
using System;
public T CastObject<T>(object input) {
return (T) input;
}
public T ConvertObject<T>(object input) {
return (T) Convert.ChangeType(input, typeof(T));
}
Editar:
Algunas personas en los comentarios dicen que esta respuesta no responde la pregunta. Pero la línea (T) Convert.ChangeType(input, typeof(T))
proporciona la solución. El Convert.ChangeType
método intenta convertir cualquier Objeto al Tipo proporcionado como segundo argumento.
Por ejemplo:
Type intType = typeof(Int32);
object value1 = 1000.1;
// Variable value2 is now an int with a value of 1000, the compiler
// knows the exact type, it is safe to use and you will have autocomplete
int value2 = Convert.ChangeType(value1, intType);
// Variable value3 is now an int with a value of 1000, the compiler
// doesn't know the exact type so it will allow you to call any
// property or method on it, but will crash if it doesn't exist
dynamic value3 = Convert.ChangeType(value1, intType);
He escrito la respuesta con genéricos, porque creo que es una señal muy probable de olor a código cuando quieres transmitir a something
sin a something else
manejar un tipo real. Con interfaces adecuadas que no deberían ser necesarias el 99,9% de las veces. Quizás haya algunos casos extremos en lo que respecta a la reflexión que podría tener sentido, pero recomendaría evitar esos casos.
Edición 2:
Algunos consejos adicionales:
- Intente mantener su código lo más seguro posible. Si el compilador no conoce el tipo, entonces no podrá verificar si su código es correcto y cosas como la función de autocompletar no funcionarán. Dicho simplemente: si no puede predecir los tipos en el momento de la compilación, ¿cómo podría hacerlo el compilador ?
- Si las clases con las que está trabajando implementan una interfaz común , puede convertir el valor a esa interfaz. De lo contrario, considere crear su propia interfaz y hacer que las clases implementen esa interfaz.
- Si está trabajando con bibliotecas externas que está importando dinámicamente, busque también una interfaz común. De lo contrario, considere crear pequeñas clases contenedoras que implementen la interfaz.
- Si desea realizar llamadas al objeto, pero no le importa el tipo, almacene el valor en una variable
object
odynamic
. - Los genéricos pueden ser una excelente manera de crear código reutilizable que se aplique a muchos tipos diferentes, sin tener que conocer los tipos exactos involucrados.
- Si está atascado, considere un enfoque diferente o una refactorización de código. ¿Tu código realmente tiene que ser tan dinámico? ¿Tiene que dar cuenta de algún tipo que exista?
Otras respuestas no mencionan el tipo "dinámico". Entonces, para agregar una respuesta más, puede usar el tipo "dinámico" para almacenar el objeto resultante sin tener que convertir el objeto convertido con un tipo estático.
dynamic changedObj = Convert.ChangeType(obj, typeVar);
changedObj.Method();
Tenga en cuenta que con el uso de "dinámico" el compilador omite la verificación de tipos estáticos, lo que podría introducir posibles errores de tiempo de ejecución si no tiene cuidado.
Además, se supone que el obj es una instancia de Type typeVar o es convertible a ese tipo.