我的类我有一个带有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
}
答案 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()
方法。