委托与参数..作为参数

本文关键字:参数 | 更新日期: 2023-09-27 18:12:32

我有这个方法和它的委托,用于从我的WinForms应用程序中的任何线程在GUI中添加文本到多行文本框:

private delegate void TextAppendDelegate(TextBox txt, string text);
public void TextAppend(TextBox txt, string text)
{
  if(txt.InvokeRequired)
    txt.Invoke(new TextAppendDelegate(TextAppend), new object[] {txt, text });
  else
  {
    if(txt.Lines.Length == 1000)
    {
      txt.SelectionStart = 0;
      txt.SelectionLength = txt.Text.IndexOf("'n", 0) + 1;
      txt.SelectedText = "";
    }
    txt.AppendText(text + "'n");
    txt.ScrollToCaret();
  }
}

它工作得很好,我只是从任何线程调用TextAppend(myTextBox1,"嗨,世界!")和GUI更新。现在,有没有办法传递一个调用TextAppend的委托到另一个项目中的一个实用程序方法,而不向实际的TextBox发送任何引用,从调用者那里可能看起来像这样:

Utilities.myUtilityMethod(
    new delegate(string str){ TextAppend(myTextBox1, str) });

在调用程序中,定义类似于:

public static void myUtilityMethod(delegate del)
{
    if(del != null) { del("Hi Worldo!"); }
}

这样,当调用这个函数时,它调用TextAppend方法,并使用调用者想要使用的字符串和预定义的TextBox。这是可能的还是我疯了?我知道有更简单的选择,比如使用接口或传递TextBox和delegate,但我想探索这个解决方案,因为它看起来更优雅,并且对被调用者隐藏了一些东西。问题是我对c#还是个新手,几乎不理解委托,所以请帮助我了解实际的语法。

提前感谢!

委托与参数..作为参数

假设您使用的是c# 3 (VS2008)或更高版本:

Utilities.myUtilityMethod(str => TextAppend(myTextBox1, str));
...
public static void myUtilityMethod(Action<string> textAppender)
{
    if (textAppender != null) { textAppender("Hi Worldo!"); }
}

如果你使用的是。net 2.0,你可以使用匿名方法代替lambda表达式:

Utilities.myUtilityMethod(delegate(string str) { TextAppend(myTextBox1, str); });

如果你正在使用。net 1。X,您需要自己定义委托并使用命名方法:

delegate void TextAppender(string str);
void AppendToTextBox1(string str)
{
    TextAppend(myTextBox1, str);
}
...
Utilities.myUtilityMethod(new TextAppender(AppendToTextBox1));
...
public static void myUtilityMethod(TextAppender textAppender)
{
    if (textAppender != null) { textAppender("Hi Worldo!"); }
}