Я хотел бы установить свойство объекта через Reflection со значением типа string
. Так, например, предположим, у меня естьShip
класс со свойством Latitude
, которое является double
.
Вот что я хотел бы сделать:
Ship ship = new Ship();
string value = "5.5";
PropertyInfo propertyInfo = ship.GetType().GetProperty("Latitude");
propertyInfo.SetValue(ship, value, null);
Как это, это бросает ArgumentException
:
Объект типа «System.String» не может быть преобразован в тип «System.Double».
Как я могу преобразовать значение в правильный тип, на основе propertyInfo
?
c#
reflection
type-conversion
propertyinfo
setvalue
Дэвид Ходжсон
источник
источник
Ответы:
Вы можете использовать
Convert.ChangeType()
- Это позволяет вам использовать информацию времени выполнения для любогоIConvertible
типа, чтобы изменить форматы представления. Однако не все преобразования возможны, и вам может потребоваться написать специальную логику, если вы хотите поддерживать преобразования из типов, которые этого не делаютIConvertible
.Соответствующий код (без обработки исключений или логики специального случая) будет:
источник
TryChangeType
илиCanChangeType
?Как уже говорили несколько других, вы хотите использовать
Convert.ChangeType
:На самом деле, я рекомендую вам взглянуть на весь
Convert
класс .Этот класс и многие другие полезные классы являются частью
System
пространства имен . Я считаю полезным сканировать это пространство имен каждый год или около того, чтобы увидеть, какие функции я пропустил. Попробуйте!источник
Я заметил, что многие люди рекомендуют
Convert.ChangeType
- в некоторых случаях это работает, но как только вы начнете привлекатьnullable
типы, вы начнете получатьInvalidCastExceptions
:Оболочка была написана несколько лет назад, чтобы справиться с этим, но это тоже не идеально.
источник
Я попробовал ответ от Л.Бушкина, и он работал отлично, но он не будет работать для пустых значений и полей, допускающих обнуление. Итак, я изменил это на это:
источник
Вы можете использовать конвертер типов (без проверки ошибок):
С точки зрения организации кода, вы могли бы создать своего рода миксин, который привел бы к такому коду:
Это будет достигнуто с помощью этого кода:
MPropertyAsStringSettable
можно использовать для разных классов.Вы также можете создать свои собственные конвертеры типов для привязки к своим свойствам или классам:
источник
object
?object
добавит методы расширения ко всем классам, что обычно нежелательно.Вы, наверное, ищете
Convert.ChangeType
метод. Например:источник
Использование
Convert.ChangeType
и получение типа для преобразования изPropertyInfo.PropertyType
.источник
Я отвечу на это общим ответом. Обычно эти ответы не работают с гидами. Вот рабочая версия с направляющими тоже.
источник
Или вы можете попробовать:
источник
Если вы пишете приложение Metro, вы должны использовать другой код:
Примечание:
вместо того
источник
Использование следующего кода должно решить вашу проблему:
источник
Вы хотите поиграть с Reflection или создать производственное программное обеспечение? Я хотел бы спросить, почему вы используете отражение, чтобы установить свойство.
источник
GenericProgramming.exe:ReflectionBenefits()
)