C #: Come ottenere il valore assegnato da un'azione?
Domanda
Uso il seguente codice per invocare e accedere alle proprietà sul mio da un thread diverso.
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);
}
La mia domanda:
Se chiamo PFA (form = > form.Richbox1.Text = " Test ")
- Voglio che PFA () controlli se l'azione è (Richbox1.Text) e in tal caso quindi Aggiungi " \ n " al testo (" Test ").
L'idea è di chiamare
PFA(form => form.Richbox1.Text = "Test");
anziché
PFA(form => form.Richbox1.Text = "Test\n");
In altre parole, voglio aggiungere automaticamente una nuova riga se l'azione è " Richbox1.Text = "
Come lo faccio? Non ho mai lavorato con azioni prima.
Soluzione
E se lo facessi:
PFA(form => UpdateTextBox(form.Richbox1,"Test"));
public void UpdateTextBox(RichTextBox box,string text)
{
if (box.Name=="Richbox1")
{
text+="\n";
}
box.AppendText(text);
}
Non sarai in grado di guardare all'interno dell'azione e determinare se sta usando un cotnrol specifico al di fuori dell'azione. Pertanto, è necessario aggiungere \ n prima di chiamare PFA oppure fare in modo che PFA chiami una funzione che farà ciò che si desidera o che PFA attui la logica.
Altri suggerimenti
Puoi aggiungere un metodo di estensione per fare il trucco. Prova quanto segue.
public static void AddNewLineIfMatch(this RichTextBox rtb, string toMatch) {
if ( rtb.Text == toMatch ) {
rtb.AppendText("\n");
}
}
PFDA(() => form.Richbox1.AddNewLineIfMatch("Test"));
MODIFICA Utilizzato il metodo AppendText anziché Text + =
Non puoi farlo nel modo desiderato. La funzione PFA non può controllare cosa c'è dentro il tuo delegato. Pensa a come risolvere il tuo compito in un altro modo.
[offtopic]
PS. Inoltre, la tua convenzione di denominazione non è molto buona. & Quot; PFA " non spiega cosa fa la funzione e per quanto riguarda "frmain" - di solito i nomi delle classi iniziano con la lettera maiuscola.
[/ Offtopic]
UPDATE: Lo farei un po 'meglio di quello che Josh ha offerto:
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;
}
Puoi farlo passando dall'azione all'espressione > ;. Quindi puoi vedere cosa sta succedendo nel metodo in questo modo
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)
}
Questo ti dà le informazioni necessarie per capire la proprietà, ma non come aggiungere il \ n. Lascio a te questo per scoprirlo. Penso che questo sia eccessivo qui, ma chissà, forse questo potrebbe aiutare te o qualcun altro, o persino ispirare una buona soluzione.
Una buona soluzione a cui potrei pensare a dove poter riutilizzare questa funzionalità è come un motore di regole in cui è possibile confrontare quale sia la proprietà a cui si accede ed eseguire un'azione subito dopo di essa, ecc.