将事件封装到方法中?

时间:2009-06-05 23:07:26

标签: c# methods event-handling c#-2.0

让我们说,我不能修改A类。

我在class A<T>中有这个,有JumpNext()方法:

public void JumpNext();

它会在class A<T>中触发一个名为Next

的事件

这是我班上的B:

public T Next()
{
    instanceofA.JumpNext();
    //instanceofA.Next += something;
    // wait for event
    // someting(object sender, AEventArgs e)
    //return e.Entry
}

问题是,我的Next方法必须返回T事件返回的Entry AEventArgs字段中包含的A.Next实例

那么如何在B类的一个方法中做到这一点?

我正在使用.NET 2.0,但如果它确实可以在任何更高版本中使用,那也可能没问题。

3 个答案:

答案 0 :(得分:3)

如果我正确理解你的问题,你想在B.Next()方法中处理A.Next事件。您可以使用anonymous method,执行此操作,但必须注意不要多次注册事件处理程序:

假设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;
}

答案 1 :(得分:2)

你可以这样做:

    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;
    }

答案 2 :(得分:0)

我做了两者的组合:

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;
}