Me gustaría establecer una propiedad de un objeto a través de Reflection, con un valor de tipo string
. Entonces, por ejemplo, supongamos que tengo una Ship
clase, con una propiedad de Latitude
, que es a double
.
Esto es lo que me gustaría hacer:
Ship ship = new Ship();
string value = "5.5";
PropertyInfo propertyInfo = ship.GetType().GetProperty("Latitude");
propertyInfo.SetValue(ship, value, null);
Como es, esto arroja un ArgumentException
:
El objeto del tipo 'System.String' no se puede convertir al tipo 'System.Double'.
¿Cómo puedo convertir el valor al tipo adecuado, según propertyInfo
?
c#
reflection
type-conversion
propertyinfo
setvalue
David Hodgson
fuente
fuente
Respuestas:
Puede usar
Convert.ChangeType()
: le permite usar información de tiempo de ejecución en cualquierIConvertible
tipo para cambiar los formatos de representación. Sin embargo, no todas las conversiones son posibles, y es posible que deba escribir una lógica de caso especial si desea admitir conversiones de tipos que no lo sonIConvertible
.El código correspondiente (sin manejo de excepciones o lógica de caso especial) sería:
fuente
TryChangeType
oCanChangeType
?Como han dicho varios otros, desea utilizar
Convert.ChangeType
:De hecho, te recomiendo que mires a toda la
Convert
clase .Esta clase y muchas otras clases útiles son parte del
System
espacio de nombres . Me resulta útil escanear ese espacio de nombres cada año más o menos para ver qué características me he perdido. ¡Darle una oportunidad!fuente
Noté que mucha gente recomienda
Convert.ChangeType
: esto funciona para algunos casos, sin embargo, tan pronto como comience a involucrarnullable
tipos, comenzará a recibirInvalidCastExceptions
:Hace unos años se escribió un contenedor para manejar esto, pero eso tampoco es perfecto.
fuente
Intenté la respuesta de LBushkin y funcionó muy bien, pero no funcionará para valores nulos y campos anulables. Entonces lo he cambiado a esto:
fuente
Puede usar un convertidor de tipos (sin comprobación de errores):
En términos de organizar el código, podría crear un tipo de mixin que resultaría en un código como este:
Esto se lograría con este código:
MPropertyAsStringSettable
Se puede reutilizar para muchas clases diferentes.También puede crear sus propios convertidores de tipos personalizados para adjuntarlos a sus propiedades o clases:
fuente
object
?object
agregaría los métodos de extensión a todas las clases, lo que generalmente no es deseable.Probablemente estés buscando el
Convert.ChangeType
método. Por ejemplo:fuente
Usar
Convert.ChangeType
y obtener el tipo para convertir desdePropertyInfo.PropertyType
.fuente
Contestaré esto con una respuesta general. Por lo general, estas respuestas no funcionan con guías. Aquí hay una versión funcional con guías también.
fuente
O podrías probar:
fuente
Si está escribiendo la aplicación Metro, debe usar otro código:
Nota:
en vez de
fuente
El uso del siguiente código debería resolver su problema:
fuente
¿Estás buscando jugar con Reflection o estás buscando construir un software de producción? Me preguntaría por qué estás usando la reflexión para establecer una propiedad.
fuente
GenericProgramming.exe:ReflectionBenefits()
)