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 Shipclase, 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 cualquierIConvertibletipo 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
TryChangeTypeoCanChangeType?Como han dicho varios otros, desea utilizar
Convert.ChangeType:De hecho, te recomiendo que mires a toda la
Convertclase .Esta clase y muchas otras clases útiles son parte del
Systemespacio 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 involucrarnullabletipos, 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:
MPropertyAsStringSettableSe 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?objectagregaría los métodos de extensión a todas las clases, lo que generalmente no es deseable.Probablemente estés buscando el
Convert.ChangeTypemétodo. Por ejemplo:fuente
Usar
Convert.ChangeTypey 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())