在其 class 中引发事件,在另一个中调用它并在第三个中附加它
Raising event in its class, calling it in another and attaching it in 3rd
您好,我搜索了一段时间但没有找到解决我的问题的方法。而且我 100% 确定解决方案只是一行我无法理解的简单代码;(
... 所以我这里有一个 class 带有委托 AlarmHandler 和事件 AlarmEvent8 该事件在方法 IncreaseHoursBy1
中引发
class Clock
{
public delegate void AlarmHandler(string info);
public event AlarmHandler AlarmEvent8;
private int minutes;
private int hours;
public int Minutes
{
get { return minutes; }
}
public int Hours
{
get { return hours; }
}
public Clock(int minutes, int hours)
{
this.minutes = minutes;
this.hours = hours;
}
public void IncreaseHoursBy1()
{
this.hours += 1;
if(this.hours == 8)
{
if(AlarmEvent8 != null)
{
this.AlarmEvent8("Time to wake up!");
}
}
}
现在我想在另一个 class:
中为事件创建一个处理程序
class Person
{
private string name;
public Person(string name)
{
this.name = name;
}
public string EventHandler(string info)
{
return this.name + " " + info;
}
}
最后我想在我的 Form1 的构造函数中将处理程序附加到事件,但我不知道我的 Form1 构造函数如何
Clock myClock;
Person Me;
public Form1()
{
InitializeComponent();
myClock = new Clock(50, 2);
Me = new Person("RandomPerson");
myClock.AlarmEvent8 += new Clock.AlarmHandler(Me.EventHandler(info));
}
我目前遇到的错误是 "info" 尚不存在。
提前谢谢你。
你不需要那里的信息。该行应如下所示
myClock.AlarmEvent8 += new Clock.AlarmHandler(info => Me.EventHandler(info));
此外,您可以将 EventHandler 本身更改为 return 任何东西(这通常是这样做的)
public void EventHandler(string info)
myClock.AlarmEvent8 += new Clock.AlarmHandler(Me.EventHandler);
您通常会像这样连接您的处理程序:
myClock.AlarmEvent8 += new Clock.AlarmHandler(Me.EventHandler);
请注意,info
变量是在调用处理程序时传递的,而不是在您添加处理程序时传递的。
但是,在这种情况下,您会收到以下语法错误:
CS0407 'string Person.EventHandler(string)' has the wrong return type
你这里有点奇怪。您的 delegate
定义为:
public delegate void AlarmHandler(string info);
然而,您尝试附加的处理程序具有此签名:
public string EventHandler(string info)
注意前者的return类型是void
,后者的是string
。它们不兼容。
因此您要么必须更改 delegate
的签名,要么更改处理程序方法以使它们匹配。
通常的做法是同时拥有 return void
。在那种情况下,Person
中的处理程序方法必须写成这样:
public void EventHandler(string info)
{
Console.WriteLine(this.name + " " + info);
}
您不能再 return 一个值,因此您必须以某种方式当场处理该事件。我选择将值写入控制台。
但是,如果您将委托更改为 return string
,那么您将能够在事件引发代码中处理 return 值,如下所示:
public void IncreaseHoursBy1()
{
this.hours += 1;
if (this.hours == 8)
{
if (AlarmEvent8 != null)
{
Console.WriteLine(this.AlarmEvent8("Time to wake up!"));
}
}
}
现在,如果我 运行 使用此代码的这些变体之一:
var myClock = new Clock(50, 2);
var Me = new Person("RandomPerson");
myClock.AlarmEvent8 += new Clock.AlarmHandler(Me.EventHandler);
myClock.IncreaseHoursBy1();
myClock.IncreaseHoursBy1();
myClock.IncreaseHoursBy1();
myClock.IncreaseHoursBy1();
myClock.IncreaseHoursBy1();
myClock.IncreaseHoursBy1();
myClock.IncreaseHoursBy1();
myClock.IncreaseHoursBy1();
我得到以下输出:
RandomPerson Time to wake up!
然而,区别在于这段代码:
var myClock = new Clock(50, 2);
var Me1 = new Person("Person 1");
var Me2 = new Person("Person 2");
myClock.AlarmEvent8 += new Clock.AlarmHandler(Me1.EventHandler);
myClock.AlarmEvent8 += new Clock.AlarmHandler(Me2.EventHandler);
myClock.IncreaseHoursBy1();
myClock.IncreaseHoursBy1();
myClock.IncreaseHoursBy1();
myClock.IncreaseHoursBy1();
myClock.IncreaseHoursBy1();
myClock.IncreaseHoursBy1();
myClock.IncreaseHoursBy1();
myClock.IncreaseHoursBy1();
如果我 运行 使用 void
-return ing delegate
代码我得到这个输出:
Person 1 Time to wake up!
Person 2 Time to wake up!
如果我 运行 使用 string-returning
delegate` 代码,我只会得到这个:
Person 2 Time to wake up!
如果您将多个处理程序附加到一个 return 值的事件,则只有最后一个委托的 return 值被传回 - 即使两个处理程序 运行.
你真的应该尝试坚持 void
-returning 代表。
另一种选择,如 Vikhram 所示,使用您的原始代码并执行此操作:
myClock.AlarmEvent8 += new Clock.AlarmHandler(info => Me.EventHandler(info));
但是,这会丢弃 Me.EventHandler(info)
调用中的 return 值。在这里用 return 值做一些事情会很有用:
myClock.AlarmEvent8 += new Clock.AlarmHandler(info => Console.WriteLine(Me.EventHandler(info)));
所以,如果我现在转到此代码:
var myClock = new Clock(50, 2);
var Me1 = new Person("Person 1");
var Me2 = new Person("Person 2");
myClock.AlarmEvent8 += new Clock.AlarmHandler(info => Console.WriteLine(Me1.EventHandler(info)));
myClock.AlarmEvent8 += new Clock.AlarmHandler(info => Console.WriteLine(Me2.EventHandler(info)));
myClock.IncreaseHoursBy1();
myClock.IncreaseHoursBy1();
myClock.IncreaseHoursBy1();
myClock.IncreaseHoursBy1();
myClock.IncreaseHoursBy1();
myClock.IncreaseHoursBy1();
myClock.IncreaseHoursBy1();
myClock.IncreaseHoursBy1();
和运行它,我得到这个输出:
Person 1 Time to wake up!
Person 2 Time to wake up!
我想这就是您可能想要做的。
三种不同的方法表明您可以在三个不同的位置处理 public string EventHandler(string info)
中计算的结果。什么最适合您真的取决于您。
您好,我搜索了一段时间但没有找到解决我的问题的方法。而且我 100% 确定解决方案只是一行我无法理解的简单代码;( ... 所以我这里有一个 class 带有委托 AlarmHandler 和事件 AlarmEvent8 该事件在方法 IncreaseHoursBy1
中引发class Clock
{
public delegate void AlarmHandler(string info);
public event AlarmHandler AlarmEvent8;
private int minutes;
private int hours;
public int Minutes
{
get { return minutes; }
}
public int Hours
{
get { return hours; }
}
public Clock(int minutes, int hours)
{
this.minutes = minutes;
this.hours = hours;
}
public void IncreaseHoursBy1()
{
this.hours += 1;
if(this.hours == 8)
{
if(AlarmEvent8 != null)
{
this.AlarmEvent8("Time to wake up!");
}
}
}
现在我想在另一个 class:
中为事件创建一个处理程序 class Person
{
private string name;
public Person(string name)
{
this.name = name;
}
public string EventHandler(string info)
{
return this.name + " " + info;
}
}
最后我想在我的 Form1 的构造函数中将处理程序附加到事件,但我不知道我的 Form1 构造函数如何
Clock myClock;
Person Me;
public Form1()
{
InitializeComponent();
myClock = new Clock(50, 2);
Me = new Person("RandomPerson");
myClock.AlarmEvent8 += new Clock.AlarmHandler(Me.EventHandler(info));
}
我目前遇到的错误是 "info" 尚不存在。 提前谢谢你。
你不需要那里的信息。该行应如下所示
myClock.AlarmEvent8 += new Clock.AlarmHandler(info => Me.EventHandler(info));
此外,您可以将 EventHandler 本身更改为 return 任何东西(这通常是这样做的)
public void EventHandler(string info)
myClock.AlarmEvent8 += new Clock.AlarmHandler(Me.EventHandler);
您通常会像这样连接您的处理程序:
myClock.AlarmEvent8 += new Clock.AlarmHandler(Me.EventHandler);
请注意,info
变量是在调用处理程序时传递的,而不是在您添加处理程序时传递的。
但是,在这种情况下,您会收到以下语法错误:
CS0407 'string Person.EventHandler(string)' has the wrong return type
你这里有点奇怪。您的 delegate
定义为:
public delegate void AlarmHandler(string info);
然而,您尝试附加的处理程序具有此签名:
public string EventHandler(string info)
注意前者的return类型是void
,后者的是string
。它们不兼容。
因此您要么必须更改 delegate
的签名,要么更改处理程序方法以使它们匹配。
通常的做法是同时拥有 return void
。在那种情况下,Person
中的处理程序方法必须写成这样:
public void EventHandler(string info)
{
Console.WriteLine(this.name + " " + info);
}
您不能再 return 一个值,因此您必须以某种方式当场处理该事件。我选择将值写入控制台。
但是,如果您将委托更改为 return string
,那么您将能够在事件引发代码中处理 return 值,如下所示:
public void IncreaseHoursBy1()
{
this.hours += 1;
if (this.hours == 8)
{
if (AlarmEvent8 != null)
{
Console.WriteLine(this.AlarmEvent8("Time to wake up!"));
}
}
}
现在,如果我 运行 使用此代码的这些变体之一:
var myClock = new Clock(50, 2);
var Me = new Person("RandomPerson");
myClock.AlarmEvent8 += new Clock.AlarmHandler(Me.EventHandler);
myClock.IncreaseHoursBy1();
myClock.IncreaseHoursBy1();
myClock.IncreaseHoursBy1();
myClock.IncreaseHoursBy1();
myClock.IncreaseHoursBy1();
myClock.IncreaseHoursBy1();
myClock.IncreaseHoursBy1();
myClock.IncreaseHoursBy1();
我得到以下输出:
RandomPerson Time to wake up!
然而,区别在于这段代码:
var myClock = new Clock(50, 2);
var Me1 = new Person("Person 1");
var Me2 = new Person("Person 2");
myClock.AlarmEvent8 += new Clock.AlarmHandler(Me1.EventHandler);
myClock.AlarmEvent8 += new Clock.AlarmHandler(Me2.EventHandler);
myClock.IncreaseHoursBy1();
myClock.IncreaseHoursBy1();
myClock.IncreaseHoursBy1();
myClock.IncreaseHoursBy1();
myClock.IncreaseHoursBy1();
myClock.IncreaseHoursBy1();
myClock.IncreaseHoursBy1();
myClock.IncreaseHoursBy1();
如果我 运行 使用 void
-return ing delegate
代码我得到这个输出:
Person 1 Time to wake up!
Person 2 Time to wake up!
如果我 运行 使用 string-returning
delegate` 代码,我只会得到这个:
Person 2 Time to wake up!
如果您将多个处理程序附加到一个 return 值的事件,则只有最后一个委托的 return 值被传回 - 即使两个处理程序 运行.
你真的应该尝试坚持 void
-returning 代表。
另一种选择,如 Vikhram 所示,使用您的原始代码并执行此操作:
myClock.AlarmEvent8 += new Clock.AlarmHandler(info => Me.EventHandler(info));
但是,这会丢弃 Me.EventHandler(info)
调用中的 return 值。在这里用 return 值做一些事情会很有用:
myClock.AlarmEvent8 += new Clock.AlarmHandler(info => Console.WriteLine(Me.EventHandler(info)));
所以,如果我现在转到此代码:
var myClock = new Clock(50, 2);
var Me1 = new Person("Person 1");
var Me2 = new Person("Person 2");
myClock.AlarmEvent8 += new Clock.AlarmHandler(info => Console.WriteLine(Me1.EventHandler(info)));
myClock.AlarmEvent8 += new Clock.AlarmHandler(info => Console.WriteLine(Me2.EventHandler(info)));
myClock.IncreaseHoursBy1();
myClock.IncreaseHoursBy1();
myClock.IncreaseHoursBy1();
myClock.IncreaseHoursBy1();
myClock.IncreaseHoursBy1();
myClock.IncreaseHoursBy1();
myClock.IncreaseHoursBy1();
myClock.IncreaseHoursBy1();
和运行它,我得到这个输出:
Person 1 Time to wake up!
Person 2 Time to wake up!
我想这就是您可能想要做的。
三种不同的方法表明您可以在三个不同的位置处理 public string EventHandler(string info)
中计算的结果。什么最适合您真的取决于您。