C# 将事件封装到方法中?
比方说,我不能修改A类 我有一个C# 将事件封装到方法中?,c#,methods,event-handling,c#-2.0,C#,Methods,Event Handling,C# 2.0,比方说,我不能修改A类 我有一个a类,有一个JumpNext()方法: public void JumpNext(); 它在A类中触发一个事件,称为下一个 这在我的B班: public T Next() { instanceofA.JumpNext(); //instanceofA.Next += something; // wait for event // someting(object sender, AEventArgs e) //return
a类
,有一个JumpNext()
方法:
public void JumpNext();
它在A类
中触发一个事件,称为下一个
这在我的B班:
public T Next()
{
instanceofA.JumpNext();
//instanceofA.Next += something;
// wait for event
// someting(object sender, AEventArgs e)
//return e.Entry
}
问题是,我的Next
方法必须返回A.Next
事件返回的AEventArgs
的Entry
字段中包含的T
的实例
那么如何在类B中的一个方法中实现这一点呢
我正在使用.NET 2.0,但如果它确实只在任何更高版本中可用,那也可以。您可以这样做:
public void T Next()
{
T value = default(T);
EventHandler<AEventArgs> handler = new EventHandler<AEventArgs>(delegate(object sender, AEventArgs e) { value = e.Entry; });
instanceofA.Next += handler;
instanceofA.JumpNext();
instanceofA.Next -= handler;
return value;
}
public void T Next()
{
T值=默认值(T);
EventHandler=neweventhandler(委托(对象发送者,AEventArgs e){value=e.Entry;});
instanceofA.Next+=处理程序;
instanceofA.JumpNext();
instanceofA.Next-=处理程序;
返回值;
}
您可以这样做:
public void T Next()
{
T value = default(T);
EventHandler<AEventArgs> handler = new EventHandler<AEventArgs>(delegate(object sender, AEventArgs e) { value = e.Entry; });
instanceofA.Next += handler;
instanceofA.JumpNext();
instanceofA.Next -= handler;
return value;
}
public void T Next()
{
T值=默认值(T);
EventHandler=neweventhandler(委托(对象发送者,AEventArgs e){value=e.Entry;});
instanceofA.Next+=处理程序;
instanceofA.JumpNext();
instanceofA.Next-=处理程序;
返回值;
}
如果我正确理解了您的问题,您希望在B.Next()方法中处理A.Next事件。可以使用,但必须注意不要多次注册事件处理程序:
假设下一个事件定义为这样声明的委托:
public delegate vote NextHandler(object sender, AEventArgs e);
你可以做:
public T Next()
{
T entry;
NextHandler handler = delegate(object sender, AEventArgs e) {
entry = e.entry;
}
instanceOfA.Next += handler;
try {
instanceOfA.JumpNext();
} finally {
instanceOfA -= handler;
}
return entry;
}
如果我正确理解了您的问题,那么您希望在B.Next()方法中处理A.Next事件。可以使用,但必须注意不要多次注册事件处理程序: 假设下一个事件定义为这样声明的委托:
public delegate vote NextHandler(object sender, AEventArgs e);
你可以做:
public T Next()
{
T entry;
NextHandler handler = delegate(object sender, AEventArgs e) {
entry = e.entry;
}
instanceOfA.Next += handler;
try {
instanceOfA.JumpNext();
} finally {
instanceOfA -= handler;
}
return entry;
}
我将两者结合起来:
public T Next()
{
T entry = default(T);
EventHandler<AEventArgs> handler = delegate(object sender, AEventArgs e)
{
entry = e.Entry;
};
instanceofA.Next+= handler;
try
{
instanceofA.JumpNext();
}
finally
{
instanceofA.Next-= handler;
}
return entry;
}
public T Next()
{
T条目=默认值(T);
EventHandler=委托(对象发送方,AEventArgs e)
{
条目=e.条目;
};
instanceofA.Next+=处理程序;
尝试
{
instanceofA.JumpNext();
}
最后
{
instanceofA.Next-=处理程序;
}
返回条目;
}
我将两者结合起来:
public T Next()
{
T entry = default(T);
EventHandler<AEventArgs> handler = delegate(object sender, AEventArgs e)
{
entry = e.Entry;
};
instanceofA.Next+= handler;
try
{
instanceofA.JumpNext();
}
finally
{
instanceofA.Next-= handler;
}
return entry;
}
public T Next()
{
T条目=默认值(T);
EventHandler=委托(对象发送方,AEventArgs e)
{
条目=e.条目;
};
instanceofA.Next+=处理程序;
尝试
{
instanceofA.JumpNext();
}
最后
{
instanceofA.Next-=处理程序;
}
返回条目;
}
比我快了一分钟。我要指出的是,lamba函数语法不是C#2.0的一个特性,因此Thomas Levesque的解决方案要求您使用更新版本的框架。关于这一差异的详细讨论正在进行中。还要注意的是,您需要处理JumpNext()抛出的可能性,因此我的解决方案中会出现最后一个块。@Jonathan:谢谢您的编辑;)-@是的,最好使用try/finally块,我只是为了简单起见省略了它……它仍然使用lambda表达式,即C#3.0。这在C#2.0中不起作用:委托(发送方,e)=>{value=e.Entry;}。它应该是:委托(发送者,e){value=e.Entry;}是。。。正在回滚到以前的版本;)比我快一分钟。我要指出的是,lamba函数语法不是C#2.0的一个特性,因此Thomas Levesque的解决方案要求您使用更新版本的框架。关于这一差异的详细讨论正在进行中。还要注意的是,您需要处理JumpNext()抛出的可能性,因此我的解决方案中会出现最后一个块。@Jonathan:谢谢您的编辑;)-@是的,最好使用try/finally块,我只是为了简单起见省略了它……它仍然使用lambda表达式,即C#3.0。这在C#2.0中不起作用:委托(发送方,e)=>{value=e.Entry;}。它应该是:委托(发送者,e){value=e.Entry;}是。。。正在回滚到以前的版本;)在JumpNext引发异常的情况下使用finally子句很好。在JumpNext引发异常的情况下使用finally子句很好。