Dlaczego opakowania środowiska .NET są pomijane w czasie wykonywania podczas ustawiania właściwości zależności w XAML?

Czytam książkę Adama Nathana „WPF 4 Unleashed” i na stronie 82 pojawia się następujące ostrzeżenie:

Opakowania właściwości .NET są pomijane w czasie wykonywania podczas ustawiania właściwości zależności w XAML!
Chociaż kompilator XAML zależy od opakowania właściwości w czasie kompilacji, WPF wywołuje podstawowe metody GetValue i SetValue bezpośrednio w czasie wykonywania! Dlatego, aby zachować parytet między ustawieniem właściwości w XAML a kodem proceduralnym, kluczowe jest, aby opakowania właściwości nie zawierały żadnej logiki oprócz wywołań GetValue / SetValue. Jeśli chcesz dodać niestandardową logikę, do tego służą zarejestrowane wywołania zwrotne. Wszystkie wbudowane wrapery właściwości WPF są zgodne z tą regułą, więc to ostrzeżenie jest przeznaczone dla każdego piszącego niestandardową klasę z własnymi właściwościami zależności.

Moje pytanie brzmi: dlaczego? Jakie są przyczyny, dla których WPF wywołuje GetValue () / SetValue () zamiast odczytywać / ustawiać opakowanie właściwości CLR? Jeśli powodem jest to, że odczyt / ustawienie opakowania właściwości wymaga odbicia, to WPF używa refleksji podczas konstruowania drzewa obiektów, więc czy naprawdę warto ominąć otwieranie właściwości i bezpośrednio wywoływać GetValue () / SetValue ()? Lub unikanie refleksji nie jest głównym powodem takiego zachowania?

UPD. Clemens szybko udzielił poprawnej odpowiedzi, ale dodałem jeszcze jeden cytat ze strony MSDN (jak rozumiem, StackOverflow preferuje cytaty do linków):

Typ jest wyszukiwany przez kombinację atrybutów xmlns i zespołu, ale identyfikacja elementów, określanie, które wsparcie może być ustawione jako atrybut, oraz rozwiązywanie typów obsługi wartości właściwości w przeciwnym razie wymagałoby intensywnego odbicia przy użyciu PropertyInfo. Ponieważ właściwości zależności dla danego typu są dostępne jako tabela przechowywania przez system właściwości, implementacja WPF jej procesora XAML używa tej tabeli i wnioskuje, że dowolna dana właściwość ABC może być bardziej efektywnie ustawiona przez wywołanie SetValue na zawierającym typie pochodnym DependencyObject, przy użyciu identyfikatora właściwości zależności ABCProperty.

questionAnswers(1)

yourAnswerToTheQuestion