C #: ¿Cómo obtener el valor asignado de una acción?
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.
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.