Próbuję zaimplementować transformację danych przy użyciu przykładu Reflection 1 w moim kodzie.
GetSourceValue
Funkcja posiada przełącznik porównujące różne typy, ale chcę, aby usunąć te rodzaje i właściwości i mają GetSourceValue
uzyskać wartość właściwości przy użyciu tylko jednego ciągu jako parametru. Chcę przekazać klasę i właściwość w ciągu i rozstrzygnąć wartość właściwości.
czy to możliwe?
c#
reflection
properties
pedrofernandes
źródło
źródło
public static T GetPropertyValue<T>(object obj, string propName) { return (T)obj.GetType().GetProperty(propName).GetValue(obj, null); }
src.GetType().GetProperty(propName)?.GetValue(src, null);
”;).GetProperty
czy rzuceniePropertyNotFoundException
lub coś, jeśli null.)Co powiesz na coś takiego:
Umożliwi to zejście do właściwości za pomocą jednego ciągu, takiego jak ten:
Możesz użyć tych metod jako metod statycznych lub rozszerzeń.
źródło
PropertyInfo.PropertyType
zamiastobj.GetType()
właściwości zagnieżdżonych, podobnie jak dostęp do właściwości w zagnieżdżonej właściwości.nameof
wyrażenia od C # 6 w ten sposób:nameof(TimeOfDay.Minutes)
w parametrze name podczas wywoływania funkcji, aby pozbyć się magicznych ciągów i zwiększyć bezpieczeństwo tych połączeń w czasie kompilacji.Dodaj do dowolnego
Class
:Następnie możesz użyć jako:
źródło
SetValue
iGetValue
metody działają zObject
. Jeśli chcesz pracować z określonym typem, powinieneś rzucić wynikGetValue
i rzucić wartość, aby przypisać go za pomocąSetValue
Co o użyciu
CallByName
wMicrosoft.VisualBasic
przestrzeni nazw (Microsoft.VisualBasic.dll
)? Wykorzystuje odbicie, aby uzyskać właściwości, pola i metody normalnych obiektów, obiektów COM, a nawet obiektów dynamicznych.i wtedy
źródło
Świetna odpowiedź od Jheddings. Chciałbym go ulepszyć, umożliwiając odwoływanie się do zagregowanych tablic lub kolekcji obiektów, aby właściwośćNazwa mogła być właściwością1.property2 [X] .property3:
źródło
Jeśli użyję kodu z Ed S. , dostanę
Wygląda na
GetProperty()
to, że nie jest dostępny w Xamarin.Forms.TargetFrameworkProfile
jestProfile7
w mojej Portable Class Library (.NET Framework 4.5, Windows 8, ASP.NET Core 1.0, Xamarin.Android, Xamarin.iOS, Xamarin.iOS Classic).Teraz znalazłem działające rozwiązanie:
Źródło
źródło
Informacje o dyskusji na temat właściwości zagnieżdżonych można uniknąć, stosując
DataBinder.Eval Method (Object, String)
następujące elementy:Oczywiście musisz dodać odniesienie do
System.Web
zestawu, ale to chyba nie jest wielka sprawa.źródło
Metoda wywoływania zmieniła się w .NET Standard (od wersji 1.6). Możemy również użyć operatora warunkowego null C # 6.
źródło
? operator
Korzystanie z PropertyInfo przestrzeni nazw System.Reflection . Reflection kompiluje się dobrze bez względu na to, do jakiej własności próbujemy uzyskać dostęp. Błąd pojawi się w czasie wykonywania.
Działa dobrze, aby uzyskać właściwość Location obiektu
Otrzymamy lokalizację: {X = 71, Y = 27} Możemy również zwrócić lokalizację X lub lokalizację Y w ten sam sposób.
źródło
Jest to sposób na uzyskanie wszystkich właściwości z ich wartościami na liście.
źródło
type.GetProperty(pi.Name)
kiedy to jest == do zmiennejpi
?if
i zróbselfValue?.ToString()
inaczej. Pozbądź sięif
i użyjselfValue==null?null:selfValue.ToString()
List<KeyValuePair<
jest nieparzysta, użyj słownikaDictionary<string, string>
Poniższy kod jest metodą rekurencyjną do wyświetlania całej hierarchii wszystkich nazw i wartości właściwości zawartych w instancji obiektu. Ta metoda wykorzystuje uproszczoną wersję odpowiedzi AlexD
GetPropertyValue()
powyżej w tym wątku. Dzięki temu wątkowi dyskusyjnemu udało mi się dowiedzieć, jak to zrobić!Na przykład używam tej metody, aby wyświetlić eksplozję lub zrzut wszystkich właściwości w
WebService
odpowiedzi, wywołując metodę w następujący sposób:źródło
źródło
źródło
Poniższa metoda działa dla mnie idealnie:
Aby uzyskać wartość nieruchomości:
Aby ustawić wartość właściwości:
źródło
źródło
Oto inny sposób na znalezienie zagnieżdżonej właściwości, która nie wymaga ciągu informującego o ścieżce zagnieżdżenia. Podziękowania dla Eda S. za metodę pojedynczej właściwości.
źródło
Type.GetProperty
zwracanull
zamiast dzwonićGetValue
iNullReferenceException
s rzucać w pętli.Nigdy nie wspominasz o tym, jaki obiekt oglądasz, a ponieważ odrzucasz te, które odnoszą się do danego obiektu, zakładam, że masz na myśli obiekt statyczny.
Zauważ, że zaznaczyłem kontrolowany obiekt zmienną lokalną
obj
.null
oznacza statyczne, w przeciwnym razie ustaw to, co chcesz. Zauważ też, żeGetEntryAssembly()
jest to jedna z niewielu dostępnych metod uzyskania „działającego” zestawu, możesz się z nim pobawić, jeśli masz problemy z ładowaniem tego typu.źródło
Zajrzyj do biblioteki Heleonix.Reflection . Możesz pobrać / ustawić / wywołać członków ścieżkami lub utworzyć getter / setter (lambda skompilowana w delegata), który jest szybszy niż odbicie. Na przykład:
Lub stwórz raz getter i buforuj do ponownego użycia (jest to bardziej wydajne, ale może zgłosić wyjątek NullReferenceException, jeśli element pośredni ma wartość NULL):
Lub jeśli chcesz utworzyć
List<Action<object, object>>
inny program pobierający, po prostu określ typy podstawowe dla skompilowanych delegatów (konwersje typów zostaną dodane do skompilowanych lambdas):źródło
krótsza droga ....
źródło
jheddings i AlexD napisali doskonałe odpowiedzi na temat rozwiązywania ciągów właściwości. Chciałbym wrzucić moją do miksu, ponieważ napisałem dedykowaną bibliotekę właśnie w tym celu.
Główną klasą Pather.CSharp jest
Resolver
. Domyślnie może rozpoznawać właściwości, tablicę i wpisy słownika.Na przykład, jeśli masz taki obiekt
i chcesz to zrobić
Property2
, możesz to zrobić w następujący sposób:Jest to najbardziej podstawowy przykład ścieżek, które może rozwiązać. Jeśli chcesz zobaczyć, co jeszcze może, lub jak to rozszerzyć, po prostu przejdź na stronę Github .
źródło
Oto moje rozwiązanie. Działa również z obiektami COM i umożliwia dostęp do elementów kolekcji / tablicy z obiektów COM.
źródło
Oto, co otrzymałem na podstawie innych odpowiedzi. Trochę przesada w uzyskiwaniu tak szczegółowych informacji przy obsłudze błędów.
źródło