2009-06-23 59 views
5

我使用事件作为游戏模型的一部分,对于可扩展性和代码“本地化”的缘故,我需要能够否决大多数操作。有没有实现“可选择”事件的标准方法?

更清楚,几乎具有副作用,每个方法采用这种形式:

public event TryingToDoSomethingHandler TryingToDoSomething; 
public event SomethingHappenedHandler SomethingHappened; 

/* 
* Returning true indicates Something happened successfully. 
*/ 
public bool DoSomething(...) 
{ 
    //Need a way to indicate "veto" here 
    TryingToDoSomething(...); 

    //Actual do it 

    SomethingHappened(...); 

    return true; 
} 

我想什么是TryingToDoSomething(...),以便能够表明一个注册的事件处理程序的对象(通过返回false,修改out参数或其他)。因此,该代码在道德上等同于:

/* 
* Returning true indicates Something happened successfully. 
*/ 
public bool DoSomethingImproved(...) 
{ 
    //Pretty sure multicast delegates don't work this way, but you get the idea 
    if(!TryingToDoSomething(...)) return false; 

    //Actual do it 

    SomethingHappened(...); 

    return true; 
} 

在C#/ .NET中是否存在可接受的或标准的方法?

回答

6

您是否想过可取消事件?该框架广泛使用。

创建一个EventArgs类,该类具有实现get/set的Cancel属性。事件处理程序然后可以将Cancel属性设置为true,您可以检查该通话何时返回。

public bool TrySomething() 
{ 
    CancelEventArgs e = new CancelEventArgs(); 
    if (Event1 != null) Event1.Invoke(e); 
    if (e.Cancel == false) 
    { 
     if (Event2 != null) Event2.Invoke(e); 
    } 
} 
+0

我的Java(命名)根让我再次陷入困境。这正是我所期待的。 – 2009-06-23 23:13:29

相关问题