¿Por qué los envoltorios de propiedades .NET se omiten en el tiempo de ejecución al configurar las propiedades de dependencia en XAML?
Estoy leyendo el libro de Adam Nathan "WPF 4 Unleashed" y aparece la siguiente advertencia en la página 82:
¡Los envoltorios de propiedades .NET se omiten en el tiempo de ejecución al configurar las propiedades de dependencia en XAML!
Aunque el compilador XAML depende de la envoltura de la propiedad en el momento de la compilación, WPF llama a los métodos subyacentes GetValue y SetValue directamente en 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 las envolturas de propiedad no contengan ninguna lógica además de las llamadas GetValue / SetValue. Si desea agregar lógica personalizada, para eso son las devoluciones de llamada registradas. Todos los envoltorios de propiedades incorporados 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 propiedad CLR? Si la razón es que la lectura / configuración de un contenedor de propiedades requiere reflexión, entonces WPF usa mucho la reflexión al construir un árbol de objetos, por lo tanto, ¿realmente vale la pena eludir el uso de contenedores de propiedades y llamar a GetValue () / SetValue () directamente? ¿O evitar la reflexión no es la razón principal de tal comportamiento?
UPD. Clemens rápidamente dio una respuesta correcta, pero solo agregaría una cita más de esa página de MSDN (según entiendo que StackOverflow prefiere las citas a los enlaces):
El tipo se busca a través de una combinación de atributos xmlns y de ensamblaje, pero identificando a los miembros, determinando cuál podría ser compatible como un atributo y resolviendo qué tipos admitirían los valores de propiedad que de otra manera requerirían una reflexión exhaustiva usando 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 propiedades, la implementación de WPF de su procesador XAML usa esta tabla e infiere que cualquier propiedad ABC determinada puede establecerse de manera más eficiente llamando a SetValue en el tipo derivado DependencyObject que contiene, utilizando el identificador de propiedad de dependencia ABCProperty.