2009-06-23 23 views
5

Tôi đang sử dụng các sự kiện như là một phần của mô hình trò chơi và để mở rộng và mã "địa phương", vì vậy tôi cần có thể phủ quyết hầu hết các hành động.Có cách nào tiêu chuẩn để triển khai các sự kiện "Có thể phủ nhận" không?

rõ ràng hơn, gần như mọi phương pháp mà có một tác dụng phụ có dạng như sau:

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

Những gì tôi muốn là cho TryingToDoSomething (...) để có thể chỉ ra rằng một sự kiện đã đăng ký đối tượng xử lý (thông qua trả về false, sửa đổi một tham số ngoài, hoặc một cái gì đó). Vì vậy, mã tương đương về mặt đạo đức:

/* 
* 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ó cách nào được chấp nhận hoặc tiêu chuẩn để thực hiện việc này trong C# /. NET?

Trả lời

6

Bạn có đang nghĩ về các sự kiện có thể hủy không? Khuôn khổ sử dụng rộng rãi.

Tạo lớp EventArgs có thuộc tính Cancel triển khai get/set. Trình xử lý sự kiện sau đó có thể đặt thuộc tính Cancel thành true, mà bạn có thể kiểm tra khi cuộc gọi trả về.

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

Rễ Java của tôi (đặt tên) làm cho tôi trở lại một lần nữa. Điều này thật đúng với gì mà tôi đã tìm kiếm. –

Các vấn đề liên quan