Czy istnieje sposób w języku C #, w którym można użyć odbicia do ustawienia właściwości obiektu?
Dawny:
MyObject obj = new MyObject();
obj.Name = "Value";
Chcę ustawić obj.Name
z refleksją. Coś jak:
Reflection.SetProperty(obj, "Name") = "Value";
Czy jest na to sposób?
c#
.net
reflection
properties
Melursus
źródło
źródło
var val = Convert.ChangeType(propValue, propInfo.PropertyType);
źródło: devx.com/vb2themax/Tip/19599obj.GetType().GetProperty("Name")?.GetSetMethod()?.Invoke(...)
CanWrite=False
typów, prawda?Możesz także:
gdzie cel to obiekt, dla którego zostanie ustawiona jego właściwość.
źródło
Zasadniczo odbicie, tj
lub istnieją biblioteki, które pomogą zarówno pod względem wygody, jak i wydajności; na przykład w FastMember :
(co ma tę zaletę, że nie trzeba z góry wiedzieć, czy jest to pole czy nieruchomość)
źródło
Lub możesz owinąć jedną wkładkę Marca we własną klasę rozszerzenia:
i nazwij to tak:
Dla dokładności dodajmy metodę uzyskania wartości właściwości:
źródło
Tak, używając
System.Reflection
:źródło
Użyj czegoś takiego:
lub
źródło
Możesz również uzyskać dostęp do pól w podobny sposób:
Dzięki refleksji wszystko może być otwartą książką :) W moim przykładzie wiążemy się z polem na poziomie instancji prywatnej.
źródło
Możesz to wypróbować, jeśli chcesz przypisać właściwości obiektu do innego obiektu za pomocą nazw właściwości:
źródło
Właśnie opublikowałem pakiet Nuget, który pozwala ustawić nie tylko właściwości pierwszego poziomu, ale także zagnieżdżone właściwości w danym obiekcie na dowolnej głębokości.
Oto paczka
Ustawia wartość właściwości obiektu na podstawie ścieżki od katalogu głównego.
Obiekt może być obiektem złożonym, a właściwość może być wielopoziomową właściwością zagnieżdżoną głęboko lub może być właściwością bezpośrednio pod katalogiem głównym.
ObjectWriter
znajdzie właściwość za pomocą parametru ścieżki właściwości i zaktualizuje jej wartość. Ścieżka właściwości to dołączone nazwy właściwości odwiedzanych od katalogu głównego do właściwości węzła końcowego, które chcemy ustawić, rozdzielone parametrem ciągu separatora.Stosowanie:
Aby skonfigurować właściwości bezpośrednio pod katalogiem głównym obiektu:
To znaczy.
LineItem
klasa ma właściwość int o nazwieItemId
Aby skonfigurować zagnieżdżoną właściwość na wielu poziomach poniżej katalogu głównego obiektu:
To znaczy.
Invite
klasa ma właściwość o nazwieState
, która ma właściwość o nazwieInvite
(typu Invite), która ma właściwość o nazwieRecipient
, która ma właściwość o nazwieId
.Aby uczynić rzeczy jeszcze bardziej złożonymi,
State
właściwość nie jest typem referencyjnym, jest tostruct
.Oto jak możesz ustawić właściwość Id (na wartość ciągu „outlook”) na dole drzewa obiektów w jednym wierszu.
źródło
W oparciu o sugestię MarcGravell zbudowałem następującą metodę statyczną. Metoda ogólnie przypisuje wszystkie pasujące właściwości obiektu źródłowego do obiektu docelowego za pomocą FastMember
źródło