Desejo converter uma string em um valor de propriedade do objeto, cujo nome eu tenho como string. Estou tentando fazer o seguinte:
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);
}
O problema é que isso está falhando e gerando uma exceção de conversão inválida quando o tipo de propriedade é um tipo anulável. Este não é o caso dos valores que não podem ser convertidos - eles funcionarão se eu fizer isso manualmente (por exemplo DateTime? d = Convert.ToDateTime(value);
) eu já vi algumas perguntas semelhantes, mas ainda não consigo fazê-lo funcionar.
c#
.net
reflection
iboeno
fonte
fonte
Respostas:
Não testado, mas talvez algo assim funcione:
fonte
(value == null) ? null
usar(value == null) ? default(t)
?safeValue
variável em vez de apenas reatribuir avalue
?Você precisa obter o tipo subjacente para fazer isso ...
Tente isso, eu usei com sucesso com genéricos:
Eu o uso em vários locais do meu código; um exemplo é um método auxiliar que eu uso para converter valores de banco de dados de maneira segura:
Chamado usando:
Escrevi uma série de postagens no blog, incluindo esta em http://www.endswithsaurus.com/2010_07_01_archive.html (Role para baixo até o Adendo, @JohnMacintyre realmente identificou o bug no meu código original que me levou pelo mesmo caminho que você ligado agora). Eu tenho algumas pequenas modificações desde essa postagem que incluem a conversão de tipos de enum também, portanto, se sua propriedade for um Enum, você ainda poderá usar a mesma chamada de método. Basta adicionar uma linha para verificar os tipos de enumeração e você estará pronto para as corridas usando algo como:
Normalmente, você tem alguma verificação de erro ou usa o TryParse em vez do Parse, mas você obtém a imagem.
fonte
Isso é um pouco longo, por exemplo, mas é uma abordagem relativamente robusta e separa a tarefa de transmitir de valor desconhecido para tipo desconhecido.
Eu tenho um método TryCast que faz algo semelhante e leva em consideração tipos anuláveis.
É claro que o TryCast é um método com um parâmetro de tipo, portanto, para chamá-lo dinamicamente, você deve construir o MethodInfo:
Em seguida, para definir o valor real da propriedade:
E os métodos de extensão para lidar com property.CanAssignValue ...
fonte
Eu tinha uma necessidade semelhante, e a resposta de LukeH me apontou na direção. Eu vim com essa função genérica para facilitar.
O uso é assim:
Observe que o segundo parâmetro é usado apenas como um protótipo para mostrar à função como converter o valor de retorno, portanto, na verdade, não precisa ser a propriedade de destino. Ou seja, você também pode fazer algo assim:
Eu fiz dessa maneira, em vez de usar uma saída porque você não pode usar com propriedades. Como é, ele pode trabalhar com propriedades e variáveis. Você também pode criar uma sobrecarga para passar o tipo, se quiser.
fonte
Obrigado @LukeH
eu mudei um pouco:
fonte
Eu fiz assim
fonte