Quiero convertir una cadena en un valor de propiedad de objeto, cuyo nombre tengo como cadena. Estoy tratando de hacer esto así:
string modelProperty = "Some Property Name";
string value = "SomeValue";
var property = entity.GetType().GetProperty(modelProperty);
if (property != null) {
property.SetValue(entity,
Convert.ChangeType(value, property.PropertyType), null);
}
El problema es que esto falla y genera una excepción de conversión no válida cuando el tipo de propiedad es un tipo anulable. Este no es el caso de los valores que no se pueden convertir: funcionarán si lo hago manualmente (por ejemplo DateTime? d = Convert.ToDateTime(value);
), he visto algunas preguntas similares pero todavía no puedo hacer que funcione.
c#
.net
reflection
iboeno
fuente
fuente
Respuestas:
No probado, pero tal vez algo como esto funcione:
fuente
(value == null) ? null
usar(value == null) ? default(t)
?safeValue
variable en lugar de simplemente reasignarlavalue
?Tienes que obtener el tipo subyacente para hacer eso ...
Prueba esto, lo he usado con éxito con genéricos:
Lo uso en varios lugares de mi código, un ejemplo es un método auxiliar que uso para convertir los valores de la base de datos de una manera segura:
Llamado usando:
Escribí una serie de publicaciones de blog que incluyen esto en http://www.endswithsaurus.com/2010_07_01_archive.html (Desplácese hasta el Anexo, @JohnMacintyre realmente detectó el error en mi código original que me llevó por el mismo camino que usted ahora). Tengo un par de pequeñas modificaciones desde esa publicación que incluye la conversión de tipos de enumeración también, por lo que si su propiedad es una enumeración, aún puede usar la misma llamada al método. Simplemente agregue una línea para verificar los tipos de enumeración y saldrá a las carreras usando algo como:
Normalmente tendrías algún error al comprobar o usar TryParse en lugar de Parse, pero obtienes la imagen.
fuente
Esto es un poco largo para un ejemplo, pero este es un enfoque relativamente robusto, y separa la tarea de convertir de valor desconocido a tipo desconocido.
Tengo un método TryCast que hace algo similar y tiene en cuenta los tipos anulables.
Por supuesto, TryCast es un método con un parámetro de tipo, por lo que para llamarlo dinámicamente debe construir la información del método usted mismo:
Luego, para establecer el valor real de la propiedad:
Y los métodos de extensión para tratar con property.CanAssignValue ...
fuente
Tenía una necesidad similar, y la respuesta de LukeH me señaló en la dirección. Se me ocurrió esta función genérica para que sea más fácil.
El uso es así:
Tenga en cuenta que el segundo parámetro solo se usa como prototipo para mostrar a la función cómo emitir el valor de retorno, por lo que en realidad no tiene que ser la propiedad de destino. Lo que significa que también puedes hacer algo como esto:
Lo hice de esta manera en lugar de usar una salida porque no se puede usar con propiedades. Como es, puede trabajar con propiedades y variables. También podría crear una sobrecarga para pasar el tipo si lo desea.
fuente
Gracias @LukeH
cambié un poco:
fuente
Lo hice de esta manera
fuente