Chcę przekonwertować ciąg na wartość właściwości obiektu, którego nazwę mam jako ciąg. Próbuję to zrobić w ten sposób:
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);
}
Problem polega na tym, że zawodzi i generuje niepoprawny wyjątek rzutowania, gdy typ właściwości jest typem zerowym. Nie dzieje się tak w przypadku, gdy wartości nie można przekonwertować - zadziałają, jeśli zrobię to ręcznie (np. DateTime? d = Convert.ToDateTime(value);
) Widziałem podobne pytania, ale nadal nie mogę ich uruchomić.
c#
.net
reflection
iboeno
źródło
źródło
Odpowiedzi:
Nie przetestowano, ale może coś takiego będzie działać:
źródło
(value == null) ? null
używać(value == null) ? default(t)
?safeValue
zmienną, a nie tylko zmienić przypisanie dovalue
?Musisz uzyskać typ podstawowy, aby to zrobić ...
Wypróbuj to, z powodzeniem użyłem go z lekami generycznymi:
Używam go w wielu miejscach w kodzie, jednym z przykładów jest metoda pomocnicza, której używam do konwertowania wartości bazy danych w bezpieczny sposób:
Wywoływany za pomocą:
Napisałem serię postów na blogu, w tym ten na http://www.endswithsaurus.com/2010_07_01_archive.html (Przewiń w dół do aneksu , @JohnMacintyre rzeczywiście zauważył błąd w moim oryginalnym kodzie, który poprowadził mnie tą samą ścieżką teraz). Mam kilka małych modyfikacji, ponieważ ten post obejmuje konwersję typów wyliczeń, więc jeśli twoja właściwość jest wyliczeniem, możesz nadal używać tego samego wywołania metody. Po prostu dodaj wiersz, aby sprawdzić typy wyliczeń, a będziesz w wyścigach, używając czegoś takiego:
Zwykle masz trochę sprawdzania błędów lub używasz TryParse zamiast Parse, ale dostajesz obraz.
źródło
Na przykład jest to trochę długie, ale jest to stosunkowo solidne podejście, które oddziela zadanie rzutowania z nieznanej wartości na nieznany typ
Mam metodę TryCast, która robi coś podobnego i bierze pod uwagę typy zerowalne.
Oczywiście TryCast to metoda z parametrem typu, więc aby wywołać ją dynamicznie, musisz samodzielnie zbudować metodę MethodInfo:
Następnie, aby ustawić rzeczywistą wartość właściwości:
I metody rozszerzenia do obsługi property.CanAssignValue ...
źródło
Miałem podobną potrzebę, a odpowiedź Łukasza wskazała mi kierunek. Wymyśliłem tę ogólną funkcję, aby ułatwić.
Użycie jest takie:
Zauważ, że drugi parametr służy tylko jako prototyp, aby pokazać funkcji rzutowania wartości zwracanej, więc tak naprawdę nie musi to być właściwość docelowa. Oznacza to, że możesz zrobić coś takiego:
Zrobiłem to w ten sposób, zamiast używać out, ponieważ nie można używać z właściwościami. W tej chwili może pracować z właściwościami i zmiennymi. Możesz również utworzyć przeciążenie, aby przekazać typ zamiast tego, jeśli chcesz.
źródło
Dzięki @LukeH
trochę się zmieniłem:
źródło
Zrobiłem to w ten sposób
źródło