es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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”.

Imagen

Tags:  , , , ,

Answer

  1. Avatar for 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:

    PropertyInfo baseProp = typeof(TextBoxBase).GetProperty("SelectedText", BindingFlags.Instance | BindingFlags.NonPublic);
    
    if (baseProp != null)
    {
        var baseVal = baseProp.GetValue(activeControl, null);
        // utiliza el valor de la propiedad base
    }
    

    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.

Comments are closed.