使用像Handled这样的字段定义事件

时间:2014-12-23 17:12:13

标签: c# events

我的类我有一个带有boolean字段的参数的事件Prevent和一个默认函数,如果Prevent == false则执行一些操作。我希望我的类的用户能够通过在侦听事件的函数中设置Prevent = true来防止默认函数执行操作。但事实证明,首先调用默认函数,使用Prevent = true,然后用户定义的函数更改字段的值。有没有办法改变函数调用的顺序?或者任何其他可以给我相同结果的方法?我通过定义用于检查默认函数是否应该执行其操作的Func字段并且用户可以修改提供自己的函数的字段来完成它。它有效,但我不喜欢这样一个事实,即需要2个独立的函数,一个用于在事件触发时执行操作,另一个用于防止默认行为。

部分代码:

public Func<int, int, bool> PreventFunc = new Func<int,int,bool>( (x,y) => {return false;});

public struct MyEventArgs
{ 
     int x; 
     int y; 
     bool Prevent;
     public MyEventArgs (int i, int j, bool prev) { /*assignments*/ }
}
public delegate void MyEventDelegate(object sender, MyEventArgs e);
public event MyEventDelegate MyEvent = DefaultBehaviourFunction;

void DefaultBehaviourFunction (object sender, MyEventArgs e)
{
    if (e.Prevent == true) return;
    //do stuff
}

在调用事件时

MyEvent.Invoke(sender, new MyEventArgs(i, j, PreventFunc(i,j)));

我想让它在没有PreventFunc的情况下工作,就像那样:

MyEvent += Func;
void Func (object sender, MyEventArgs e)
{ 
     if (e.x == 1) e.Prevent = true;
     //do stuff
}

1 个答案:

答案 0 :(得分:1)

您可以通过从事件委托字段获取调用列表,反转顺序以及单独调用每个目标来完成您要求的字面意思。但这将是对事件模式的滥用,以及简单地笨拙。

相反,你应该像其他类那样实现它:让引发事件的方法是检查Prevent值的方法,而不是其他一些处理程序。

例如:

private void OnMyEvent(int i, int j, bool prevent)
{
    MyEventDelegate handler = MyEvent;
    MyEventArgs e = new MyEventArgs(i, j, prevent);

    if (handler != null)
    {
        handler(this, e);
    }

    if (e.Prevent)
    {
        return;
    }

    // Member of same class, and we already know Prevent is false,
    // so just need to pass i and j.
    DefaultBehaviourFunction(i, j);
}

然后不是直接使用MyEvent.Invoke()调用事件处理程序,而是调用OnMyEvent()方法。