¿Por qué se omiten los contenedores de propiedades .NET en el tiempo de ejecución cuando se configuran las propiedades de dependencia en XAML?

Estoy leyendo el libro de Adam Nathan “WPF 4 Unleashed” y hay la siguiente advertencia en la página 82:

Los contenedores de propiedades .NET se omiten en el tiempo de ejecución cuando se configuran las propiedades de dependencia en XAML.
Aunque el comstackdor XAML depende del contenedor de propiedades en tiempo de comstackción, WPF llama directamente a los métodos GetValue y SetValue subyacentes en el tiempo de ejecución. Por lo tanto, para mantener la paridad entre la configuración de una propiedad en XAML y el código de procedimiento, es crucial que los envoltorios de propiedad no contengan ninguna lógica además de las llamadas a GetValue / SetValue. Si desea agregar lógica personalizada, para eso están las devoluciones de llamada registradas. Todas las envolturas de propiedades integradas de WPF cumplen con esta regla, por lo que esta advertencia es para cualquiera que escriba una clase personalizada con sus propias propiedades de dependencia.

Mi pregunta es: ¿Por qué? ¿Cuáles son las razones por las que WPF llama a GetValue () / SetValue () en lugar de leer / configurar un contenedor de propiedades de CLR? Si la razón es que leer / establecer un contenedor de propiedades requiere reflexión, entonces WPF usa mucho la reflexión al construir un árbol de objetos, ¿realmente vale la pena eludir el uso de contenedores de propiedades y llamar directamente a GetValue () / SetValue ()? ¿O evitar la Reflexión no es la razón principal de tal comportamiento?

UPD. Clemens rápidamente dio una respuesta correcta, pero agregaría solo una cita más de esa página de MSDN (ya que entiendo que StackOverflow prefiere las comillas a los enlaces):

El tipo se busca a través de una combinación de xmlns y atributos de ensamblaje, pero la identificación de los miembros, la determinación de cuál podría admitirse como un atributo y la resolución de los tipos que admiten los valores de propiedad requeriría una amplia reflexión utilizando PropertyInfo. Debido a que las propiedades de dependencia en un tipo dado son accesibles como una tabla de almacenamiento a través del sistema de propiedad, la implementación WPF de su procesador XAML usa esta tabla e infiere que cualquier propiedad determinada ABC puede establecerse más eficientemente llamando a SetValue en el tipo derivado DependencyObject que contiene utilizando el identificador de propiedad de dependencia ABCProperty.

La explicación se da en las propiedades de carga y dependencia de XAML :

La implementación actual de WPF de su procesador XAML es intrínsecamente propiedad de la dependencia. El procesador XAML de WPF utiliza métodos de sistema de propiedad para propiedades de dependencia al cargar XAML binario y atributos de procesamiento que son propiedades de dependencia. Esto evita de manera efectiva los envoltorios de propiedad. Cuando implemente propiedades de dependencia personalizadas, debe tener en cuenta este comportamiento y evitar colocar cualquier otro código en el contenedor de propiedades que no sean los métodos del sistema de propiedad GetValue y SetValue.

y:

Por razones de implementación, es computacionalmente menos costoso identificar una propiedad como una propiedad de dependencia y acceder al sistema de propiedad del método SetValue para establecerla, en lugar de usar el contenedor de propiedades y su configurador. Esto se debe a que un procesador XAML debe inferir todo el modelo de objeto del código de respaldo basándose únicamente en conocer el tipo y las relaciones de los miembros que están indicadas por la estructura del marcado y varias cadenas.