C#:アクションから割り当てられた値を取得する方法は?

StackOverflow https://stackoverflow.com/questions/803331

  •  03-07-2019
  •  | 
  •  

質問

次のコードを使用して、別のスレッドからfromのプロパティを呼び出してアクセスします。

    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 =&gt; form.Richbox1.Text =&quot; Test&quot;)を呼び出す場合-PFA()がアクションが(Richbox1.Text)であるかどうかを確認したい場合それから&quot; \ n&quot;を追加しますテキストへ(&quot;テスト&quot;)。

アイデアは電話することです

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

の代わりに
PFA(form => form.Richbox1.Text = "Test\n");

つまり、アクションが&quot; Richbox1.Text =&quot;の場合、自動的に新しい行を追加したい

どうすればいいですか?以前はアクションを操作したことがありませんでした。

役に立ちましたか?

解決

どうしたら:

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にロジックを実装させる必要があります。

他のヒント

拡張メソッドを追加して、トリックを行うことができます。以下を試してください。

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

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

編集 Text + =の代わりにAppendTextメソッドを使用しました

これを思い通りに行うことはできません。 PFA機能は、デリゲート内の内容を確認できません。別の方法でタスクを解決する方法を考えてください。

[offtopic]
PS。また、命名規則はあまり良くありません。 &quot; PFA&quot; &quot; frmain&quot;に関しては、関数が何をするのかを説明していません。 -通常、クラス名は大文字で始まります。
[/ 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;
}

これを実現するには、アクションから式に移動します>。次に、そのようなメソッドで何が起こっているのかを見ることができます

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を追加する方法は提供しません。調べるためにこれをあなたに任せます。ここではやり過ぎだと思いますが、知っている人は、これがあなたや他の誰かを助けたり、素敵な解決策を刺激したりするかもしれません。

この機能をどこで再利用できるか考えられる素晴らしいソリューションは、アクセスされているプロパティが何であるかを比較し、その直後にアクションを実行するルールエンジンのようなものです

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top