#c#
Вопрос:
Когда я читал о делегатах. Я решил написать простой пример в виде консольного приложения, которое могло бы имитировать действия кнопок.
Поэтому я создаю делегата и пытаюсь подписаться на два метода(OnSomethingHappened_1 и OnSomethingHappened_2) в myButtonObj.Щелкните событие. Ниже показано, что я делал до сих пор:
using System; namespace DelegateConsoleExample { public delegate void MyEventHandler(string foo); class Program { public void Main(string[] args) { MyButton myButtonObj = new MyButton(); myButtonObj.Click = new MyEventHandler(OnSomethingHappened_1); myButtonObj.Click = new MyEventHandler(OnSomethingHappened_2); } public static void OnSomethingHappened_1(string bar) { Console.WriteLine("x method runs"); Console.ReadKey(); } public static void OnSomethingHappened_2(string bar) { Console.WriteLine("y method runs"); Console.ReadKey(); } } public class MyButton { MyEventHandler myField; public event MyEventHandler Click { add { myField = value; } remove { myField -= value; } } } }
Но я не мог понять, где я делаю неправильно, так как я не могу вызвать событие с помощью myButtonObj.Нажмите(«фу»);
Ответ №1:
Во-первых, когда вы определяете делегат как событие, вы можете вызывать его только изнутри самого класса. Во-вторых, когда вы явно определяете добавление/удаление для события, вы должны использовать поле резервного копирования для его вызова. Так что вы можете сделать это, чтобы назвать это:
public class MyButton { MyEventHandler myField; public event MyEventHandler Click { add { myField = value; } remove { myField -= value; } } public void Invoke(string s) { myField(s); } } //and then calling it like this: myButtonObj.Invoke("foo");
Комментарии:
1. Но срабатывает только OnSomethingHappened_1
2. О, это потому, что мне нужно было удалить консоль. ReadKey(); Теперь работает нормально
3. @GNZ Рад, что у тебя все получилось. Пожалуйста, отметьте мой ответ, как принятый тогда.