Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将事件封装到方法中?_C#_Methods_Event Handling_C# 2.0 - Fatal编程技术网

C# 将事件封装到方法中?

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类

我有一个
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子句很好。