1

我使用以下代码从不同的线程调用和访问我的属性。

    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”(“Test”)。

想法是打电话

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

代替

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

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

我该怎么做?我以前从未使用过动作。

4

4 回答 4

1

您可以添加一个扩展方法来解决这个问题。试试下面的。

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

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

编辑使用 AppendText 方法而不是 Text+=

于 2009-04-29T17:08:18.270 回答
1

你不能以你想要的方式做到这一点。PFA 功能无法检查您的委托中的内容。想想如何以另一种方式解决您的任务。

[题外话]
PS。此外,您的命名约定不是很好。“PFA”没有解释函数的作用,对于“frmain” - 通常类名以大写字母开头。
[/题外话]

更新:我会做得比乔希提供的更好一点:

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;
}
于 2009-04-29T17:14:15.870 回答
1

如果你这样做了:

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


public void UpdateTextBox(RichTextBox box,string text)
{

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

   box.AppendText(text);
}

您将无法查看动作内部并确定它正在使用来自动作外部的特定控制。因此,您需要在调用 PFA 之前添加 \n,或者让 PFA 调用一个函数来执行您想要的操作,或者让 PFA 实现逻辑。

于 2009-04-29T17:19:29.523 回答
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。我会把这留给你找出来。我认为这在这里有点矫枉过正,但谁知道呢,也许这可以帮助您或其他人,甚至激发一个很好的解决方案。

我可能会想到一个很好的解决方案,你可以在哪里重用这个功能,就像一个规则引擎,你可以比较正在访问的属性是什么,并在它之后立即运行一个动作,等等。

于 2009-04-29T17:26:16.933 回答