2009-04-29 43 views
1

我使用下面的代码从另一个线程调用并访问我的属性。C#:如何从操作中获取分配的值?

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); 
    } 

我的问题:

如果我打电话PFA(form => form.Richbox1.Text = "Test") - 我想PFA()来检查行动(Richbox1.Text),如果是的话添加 “\ n” 来的文本(“测试“)。

的想法是调用

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

代替

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

换句话说,我希望全自动添加一个新行如果动作是 “Richbox1.Text =”

我如何做到这一点?我从来没有与行动合作过。

回答

1

如果你做的事:

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


public void UpdateTextBox(RichTextBox box,string text) 
{ 

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

    box.AppendText(text); 
} 

你不会是能够查看动作内部并确定它是使用动作之外的特定cotnrol。因此,无论是在调用PFA之前添加\ n,还是让PFA调用一个可以做你想要的功能的函数,或者让PFA实现逻辑,都可以。

1

你可以添加一个扩展方法来完成这个技巧。尝试以下操作。

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

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

编辑使用的文本的AppendText通过方法,而不是+ =

+0

对不起,你误会了我的意思,“测试”只是一个例子。我一直添加文本,我只是想添加一个新的文本行,而不是一个RichTextBox。 – 2009-04-29 17:13:52

1

你不能做到这一点,你所希望的方式。 PFA功能无法检查代表内部的内容。想想你如何以另一种方式解决你的任务。

[offtopic]
PS。另外,你的命名约定不是很好。 “PFA”并没有解释函数的功能和“frmain” - 通常类名以大写字母开头。
[/ offtopic]

更新: 我会做一个更好一点,比乔希提出:

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; 
}
+0

同意w/frmain,但PFA并不算太坏,因为我猜它是PerformFormAction – 2009-04-29 17:15:09

0

您可以通过从Action移动到Expression>来实现此目的。然后,你可以看看发生了什么的方法,像这样

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) 
} 

这给了你,你需要弄清楚属性的信息,而不是如何追加\ n。我会把这个留给你看看。我认为这在这里是过度的,但是谁知道,也许这可以帮助你或者别人,甚至激发出一个很好的解决方案。

一个很好的解决方案我可能想在那里你可以重复使用这个功能就像是一个规则引擎,你可能会后马上把它比正在访问哪些属性和运行操作等