Chciałbym ustawić właściwość obiektu poprzez odbicie, z wartością typu string
. Załóżmy na przykład, że mam Ship
klasę, której właściwość Latitude
to double
.
Oto, co chciałbym zrobić:
Ship ship = new Ship();
string value = "5.5";
PropertyInfo propertyInfo = ship.GetType().GetProperty("Latitude");
propertyInfo.SetValue(ship, value, null);
Jak to powoduje ArgumentException
:
Obiekt typu „System.String” nie może zostać przekonwertowany na typ „System.Double”.
Jak przekonwertować wartość na odpowiedni typ, na podstawie propertyInfo
?
c#
reflection
type-conversion
propertyinfo
setvalue
David Hodgson
źródło
źródło
Odpowiedzi:
Możesz użyć
Convert.ChangeType()
- pozwala na użycie informacji o środowisku wykonawczym na dowolnymIConvertible
typie w celu zmiany formatów reprezentacji. Jednak nie wszystkie konwersje są możliwe i może być konieczne napisanie specjalnej logiki wielkości liter, jeśli chcesz obsługiwać konwersje z typów, które nie sąIConvertible
.Odpowiedni kod (bez obsługi wyjątków lub logiki specjalnych przypadków) to:
źródło
TryChangeType
orCanChangeType
?Jak powiedziało kilka innych, chcesz użyć
Convert.ChangeType
:W rzeczywistości polecam spojrzeć na całą
Convert
klasę .Ta klasa i wiele innych przydatnych klas są częścią
System
Przestrzeni nazw . Uważam, że warto skanować tę przestrzeń nazw co roku, aby sprawdzić, które funkcje mi umknęły. Spróbuj!źródło
Zauważyłem, że wiele osób poleca
Convert.ChangeType
- w niektórych przypadkach działa to jednak, jak tylko zaczniesz angażowaćnullable
typy, zaczniesz otrzymywaćInvalidCastExceptions
:Kilka lat temu napisano to opakowanie, ale to też nie jest idealne.
źródło
Próbowałem odpowiedzi od LBushkina i zadziałało świetnie, ale nie zadziała dla wartości zerowych i pól zerowalnych. Zmieniłem to na:
źródło
Możesz użyć konwertera typów (bez sprawdzania błędów):
Jeśli chodzi o organizację kodu, możesz stworzyć rodzaj miksu, który dałby taki kod:
Można to osiągnąć za pomocą tego kodu:
MPropertyAsStringSettable
mogą być ponownie wykorzystane dla wielu różnych klas.Możesz także utworzyć własne konwertery typu, aby dołączyć je do swoich właściwości lub klas:
źródło
object
?object
spowoduje dodanie metod rozszerzenia do wszystkich klas, co nie jest ogólnie pożądane.Prawdopodobnie szukasz
Convert.ChangeType
metody. Na przykład:źródło
Używanie
Convert.ChangeType
i pobieranie typu do konwersji zPropertyInfo.PropertyType
.źródło
Odpowiem na to ogólną odpowiedzią. Zwykle te odpowiedzi nie działają z przewodnikami. Oto działająca wersja z prowadnicami.
źródło
Lub możesz spróbować:
źródło
Jeśli piszesz aplikację Metro, powinieneś użyć innego kodu:
Uwaga:
zamiast
źródło
Użycie następującego kodu powinno rozwiązać problem:
źródło
Czy chcesz się bawić z Reflection, czy chcesz zbudować produkcyjne oprogramowanie? Chciałbym zapytać, dlaczego używasz refleksji, aby ustawić właściwość.
źródło
GenericProgramming.exe:ReflectionBenefits()
)