Pregunta

Uso el siguiente código para invocar y acceder a las propiedades en mi desde un subproceso diferente.

    public static void PFA(Action<frmain> action)
    {
        var form = Form.ActiveForm as frmain;
        if (form != null)
        {
            form.PerformAction(action);
        }
    }

    public void PerformAction(Action<frmain> action)
    {
        if (InvokeRequired)
            Invoke(action, this);
        else
            action(this);
    }

Mi pregunta:

Si llamo PFA (form = > form.Richbox1.Text = " Prueba ") : quiero que PFA () compruebe si la acción es (Richbox1.Text) y, en caso afirmativo a continuación, agregue " \ n " al texto (" Prueba ").

La idea es llamar

PFA(form => form.Richbox1.Text = "Test"); 

en lugar de

PFA(form => form.Richbox1.Text = "Test\n");

En otras palabras, quiero agregar una nueva línea automáticamente si la acción es " Richbox1.Text = "

¿Cómo hago eso? Nunca he trabajado con acciones antes.

¿Fue útil?

Solución

¿Qué pasaría si lo hicieras?

PFA(form => UpdateTextBox(form.Richbox1,"Test"));


public void UpdateTextBox(RichTextBox box,string text)
{

   if (box.Name=="Richbox1")
   {
       text+="\n";
   }

   box.AppendText(text);
}

No podrás mirar dentro de la acción y determinar si está usando un cotnrol específico desde fuera de la acción. Por lo tanto, debe agregar el \ n antes de llamar a PFA, o hacer que PFA llame a una función que hará lo que quiere, o hacer que PFA implemente la lógica.

Otros consejos

Puedes agregar un método de extensión para hacer el truco. Intenta lo siguiente.

public static void AddNewLineIfMatch(this RichTextBox rtb, string toMatch) {
  if ( rtb.Text == toMatch ) {
    rtb.AppendText("\n");
  }
}

PFDA(() => form.Richbox1.AddNewLineIfMatch("Test"));

EDIT usó el método AppendText en lugar de Text + =

No puedes hacer esto de la manera que quieres. La función PFA no puede verificar qué hay dentro de su delegado. Piensa cómo puedes resolver tu tarea de otra manera.

[offtopic]
PD. Además, su convención de nomenclatura no es muy buena. " PFA " no explica qué hace la función y en cuanto a " frmain " - Usualmente los nombres de las clases comienzan con mayúscula.
[/ offtopic]

ACTUALIZACIÓN: Lo haría un poco mejor, de lo que Josh ofreció:

PFA(form => SetControlText(form.Richbox1, "Test"));

public void SetControlText(Control control, string text)
{ 
  control.Text = text;  
  // choose control type for which you want to add new line
  if(control is RichTextbox || control is TextBox || control is ... )
    control.Text += Environment.NewLine;
}

Podría lograr esto moviéndose de Acción a Expresión > ;. Luego puedes ver lo que está sucediendo en el método como tal

public static void PFA(Expression<Action<frmain>> expression) {
    // this will give you form.RichTextBox1
    var targetFormProperty = (MemberAccessExpression)expression.Body;
    // this only works for your example given. this gives you RichTextBox1.Text
    var textProperty = (MemberAccessExpression)targetFormProperty.Expression;

    // this is how you would run your action like normal
    var action = expression.Compile();
    action(); // invoke action (you would want to wrap this in the invoke check)
}

Esto le brinda la información que necesita para averiguar la propiedad, pero no cómo anexar el \ n. Dejaré esto para que lo averigües. Creo que esto es una exageración aquí, pero quién sabe, tal vez esto podría ayudarlo a usted u otra persona, o incluso inspirar una buena solución.

Una buena solución que podría pensar en dónde podría reutilizar esta funcionalidad es como un motor de reglas donde puede comparar qué es la propiedad a la que se accede y ejecutar una acción inmediatamente después, etc.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top