Reflected Property GetValue() lanzando NotImplementedException
Estoy intentando obtener el valor de la propiedad “SelectedText” de un control mediante reflexión. El tipo de control es un DevExpress MaskBox. Cuando depuro y miro la propiedad “SelectedText”, muestra el valor que quiero recuperar (por ejemplo, “texto seleccionado” en la imagen de abajo). Sin embargo, hay otra línea que muestra que MaskBox no ha implementado la propiedad “SelectedText” y que la propiedad es miembro del tipo base (System.Windows.Forms.TextBoxBase).
¿Cómo puedo recuperar la propiedad “SelectedText” del control sin lanzar NotImplementedException?
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
if (keyData == (Keys.Control | Keys.C) && ActiveControl.ContainsFocus)
{
bool isLayoutControl = (ActiveControl.GetType() == typeof(LayoutControl)); // devex layoutcontrol es un contenedor, por lo que se mostrará como el control activo incluso si se selecciona un cuadro de texto en el diseño
if (isLayoutControl)
{
LayoutControl layout = (LayoutControl)ActiveControl;
Control activeControl = layout.ActiveControl;
Type activeControlType = activeControl.GetType();
PropertyInfo pi = activeControlType.GetProperty("SelectedText");
var baseVal = pi.GetValue(activeControl); // lanza una excepción de "no implementado" aquí
}
}
return base.ProcessCmdKey(ref msg, keyData);
}
Aquí se puede ver que la propiedad “SelectedText” se muestra durante la depuración con el valor correcto “texto seleccionado”.
davy.ai
Dado que el control MaskBox hereda de la clase TextBoxBase, la propiedad SelectedText es en realidad un miembro de la clase base. Para recuperar el valor de la propiedad SelectedText sin lanzar una NotImplementedException, puedes usar reflexión para obtener la propiedad base y su valor de la siguiente manera:
Esto devolverá el valor de la propiedad SelectedText aunque no esté implementada directamente por el control MaskBox. La bandera BindingFlags.NonPublic se utiliza porque la propiedad SelectedText es un miembro no público de la clase base.