У меня есть этот метод с его делегатом, который используется для добавления текста в многострочный TextBox в GUI из любого потока в моем приложении WinForms:
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, "Привет, Worldo!") из любого потока, и графический интерфейс обновляется.Теперь есть какой-то способ передать делегат, который вызывает 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 и делегата, но я хочу изучить это решение, потому что оно кажется более элегантным и скрывает вещи от вызываемого.Проблема в том, что я все еще слишком новичок в C # и плохо понимаю делегатов, поэтому, пожалуйста, помогите мне с фактическим синтаксисом, который будет работать.
Заранее спасибо!