Eu gostaria de definir uma propriedade de um objeto através da reflexão, com um valor do tipo string
. Então, por exemplo, suponha que eu tenha uma Ship
classe, com uma propriedade de Latitude
, que é a double
.
Aqui está o que eu gostaria de fazer:
Ship ship = new Ship();
string value = "5.5";
PropertyInfo propertyInfo = ship.GetType().GetProperty("Latitude");
propertyInfo.SetValue(ship, value, null);
Como é, isso gera um ArgumentException
:
O objeto do tipo 'System.String' não pode ser convertido para o tipo 'System.Double'.
Como posso converter valor para o tipo adequado, com base em propertyInfo
?
c#
reflection
type-conversion
propertyinfo
setvalue
David Hodgson
fonte
fonte
Respostas:
Você pode usar
Convert.ChangeType()
- Permite usar informações de tempo de execução em qualquerIConvertible
tipo para alterar os formatos de representação. Porém, nem todas as conversões são possíveis e você pode precisar escrever uma lógica de caso especial se desejar oferecer suporte a conversões de tipos que não sãoIConvertible
.O código correspondente (sem manipulação de exceção ou lógica de caso especial) seria:
fonte
TryChangeType
ouCanChangeType
?Como vários outros disseram, você deseja usar
Convert.ChangeType
:Na verdade, eu recomendo que você olhe para toda a
Convert
classe .Esta classe e muitas outras classes úteis fazem parte do
System
espaço para nome . Acho útil verificar esse namespace todos os anos para ver quais recursos perdi. De uma chance!fonte
Percebo que muitas pessoas estão recomendando
Convert.ChangeType
- Isso funciona em alguns casos, no entanto, assim que você começa a envolver osnullable
tipos, começa a receberInvalidCastExceptions
:Um invólucro foi escrito há alguns anos para lidar com isso, mas isso também não é perfeito.
fonte
Eu tentei a resposta do LBushkin e funcionou muito bem, mas não funcionará para valores nulos e campos anuláveis. Então, eu mudei para isso:
fonte
Você pode usar um conversor de tipos (sem verificação de erros):
Em termos de organização do código, você pode criar um tipo de mixin que resultaria em código como este:
Isso seria alcançado com este código:
MPropertyAsStringSettable
pode ser reutilizado para muitas classes diferentes.Você também pode criar seus próprios conversores de tipo personalizado para anexar às suas propriedades ou classes:
fonte
object
?object
adicionaria os métodos de extensão a todas as classes, o que geralmente não é desejável.Você provavelmente está procurando o
Convert.ChangeType
método. Por exemplo:fonte
Usando
Convert.ChangeType
e obtendo o tipo para converter doPropertyInfo.PropertyType
.fonte
Vou responder isso com uma resposta geral. Geralmente essas respostas não funcionam com guias. Aqui está uma versão de trabalho com guias também.
fonte
Ou você pode tentar:
fonte
Se você estiver escrevendo o aplicativo Metro, use outro código:
Nota:
ao invés de
fonte
O uso do código a seguir deve resolver seu problema:
fonte
Você deseja brincar com o Reflection ou criar um software de produção? Gostaria de perguntar por que você está usando reflexão para definir uma propriedade.
fonte
GenericProgramming.exe:ReflectionBenefits()
)