Quiero obtener un valor de una propiedad anidada de un objeto (algo así como Person.FullName.FirstName). Vi que en .Net hay una clase llamada PropertyPath, que WPF usa para un propósito similar en Binding. ¿Hay alguna manera de reutilizar el mecanismo de WPF, o debería escribir uno por mi cuenta?¿Hay alguna forma de obtener un valor de propiedad de un objeto utilizando la clase PropertyPath?
Respuesta
La reutilización de PropertyPath es tentadora ya que admite el desplazamiento de propiedades anidadas como se señala y los índices. Usted mismo podría escribir una funcionalidad similar, yo mismo he trabajado en el pasado pero implica un análisis de texto semi complicado y un montón de trabajo de reflexión.
Como señala Andrew, simplemente puede volver a utilizar PropertyPath de WPF. Asumo que solo quieres evaluar esa ruta contra un objeto que tienes, en cuyo caso el código está un poco involucrado. Para evaluar PropertyPath debe usarse en un enlace contra un DependencyObject. Para demostrar esto, acabo de crear un DependencyObject simple llamado BindingEvaluator que tiene una DependencyProperty única. La verdadera magia sucede llamando a BindingOperations.SetBinding que aplica el enlace para que podamos leer el valor evaluado.
var path = new PropertyPath("FullName.FirstName");
var binding = new Binding();
binding.Source = new Person { FullName = new FullName { FirstName = "David"}}; // Just an example object similar to your question
binding.Path = path;
binding.Mode = BindingMode.TwoWay;
var evaluator = new BindingEvaluator();
BindingOperations.SetBinding(evaluator, BindingEvaluator.TargetProperty, binding);
var value = evaluator.Target;
// value will now be set to "David"
public class BindingEvaluator : DependencyObject
{
public static readonly DependencyProperty TargetProperty =
DependencyProperty.Register(
"Target",
typeof (object),
typeof (BindingEvaluator));
public object Target
{
get { return GetValue(TargetProperty); }
set { SetValue(TargetProperty, value); }
}
}
Si desea ampliar esta usted podría cablear los eventos PropertyChanged para apoyar la lectura de valores que cambian. ¡Espero que esto ayude!
No veo ningún motivo por el que no pueda volver a utilizarlo.
Ver PropertyPath
:
implementa una estructura de datos para describir una propiedad como un camino por debajo de otra propiedad, o por debajo de un tipo poseer. Las rutas de propiedad se usan en los datos vinculados a objetos, y en guiones gráficos y líneas de tiempo para animaciones.
- 1. ¿Hay alguna forma de obtener la dirección de un registro?
- 2. ¿Hay alguna forma de detectar si un objeto está bloqueado?
- 3. ¿Hay alguna forma de obtener un objeto gráfico dentro del programa de la consola?
- 4. ¿Hay alguna otra forma de obtener la zona horaria de un usuario de un objeto HttpServletRequest en Spring MVC?
- 5. ¿Hay alguna forma de controlar los cambios en un objeto?
- 6. ¿Hay alguna forma de exportar un objeto ActiveRecord a seeds.rb?
- 7. ¿Hay alguna forma de memorizar un valor en Haskell?
- 8. ¿Hay alguna forma de obtener el recuento actual de ref de un objeto en Python?
- 9. ¿Hay alguna forma de multirreproducir un SqlDataReader?
- 10. ¿Hay alguna forma de pluralizar texto utilizando knockoutjs
- 11. Obtener un valor de bytes utilizando stringstream
- 12. Conseguir anidada Objeto Propiedad Valor utilizando la reflexión
- 13. ¿Hay alguna forma de proporcionar un valor predeterminado para un alias de ámbito aislado?
- 14. ¿Cómo obtener un valor de propiedad mediante la reflexión
- 15. ¿Hay alguna forma de establecer el título de la página mediante enlace de datos utilizando Knockout.js?
- 16. Establecer valor de la propiedad nombre utilizando la propiedad
- 17. Obtener un valor attribue de la propiedad específica
- 18. ¿Hay alguna forma de hacer un PUT con WebClient?
- 19. ¿Hay alguna forma de modificar el valor de un campo `private static final` en Java desde fuera de la clase?
- 20. Delphi RTTI: Obtener clase de propiedad
- 21. ¿Hay alguna forma de eliminar un onTouchListener de un objeto de vista?
- 22. ¿Hay alguna manera de llegar a un miembro `protected` de otro objeto desde un tipo derivado?
- 23. ¿Hay alguna forma de establecer una variable de preprocesador para el valor de una propiedad?
- 24. ¿Hay alguna forma en C# para anular un método de clase con un método de extensión?
- 25. ¿Hay alguna manera de inicializar un objeto mediante un hash?
- 26. Oyente de la propiedad valor cambia en un objeto JavaScript
- 27. ¿Hay alguna manera de especificar un valor de propiedad predeterminado en Spring XML?
- 28. iOS obtener clase de propiedad
- 29. ¿Hay alguna forma de obtener XML de elemento por atributo?
- 30. Obtener valor de propiedad dinámicamente
¿Cómo escribirías de nuevo a esa propiedad? –
Acabo de actualizar el ejemplo de código para incluir la actualización del objetivo. Solo tienes que asegurarte de que el enlace es bidireccional y proporcionar un setter. –