2010-02-24 23 views
20

Có phải là có thể ủy nhiệm các sự kiện từ trường hợp đối tượng bên trong để xử lý sự kiện corrent đối tượng với một cú pháp như thế này:Có thể "chuỗi" EventHandlers trong C#?

public class MyControl { 
    public event EventHandler Finish; 

    private Wizard wizard; 
    public MyControl(Wizard wizard) { 
     this.wizard = wizard; 

     // some other initialization going on here... 

     // THIS is what I want to do to chain events 
     this.wizard.Finish += Finish; 
    } 
} 

Động lực cho các cấu trúc trên là tôi có nhiều dòng UI wizard thích và muốn tách Quay lại, Chuyển tiếp & Hủy xử lý cho một lớp duy nhất để tôn trọng Nguyên tắc Đóng Mở và Nguyên tắc Trách nhiệm Duy nhất trong thiết kế của tôi.

Thêm phương thức OnFinish và thực hiện kiểm tra bình thường luôn có thể nhưng trong trường hợp có rất nhiều sự kiện lồng nhau, nó sẽ kết thúc với mã lệnh soạn sẵn của lô.

Trả lời

32

Hai tùy chọn. Đầu tiên:

public event EventHandler Finish 
{ 
    add { wizard.Finish += value; } 
    remove { wizard.Finish -= value; } 
} 

Thứ hai, như bạn đề cập:

public event EventHandler Finish; 

wizard.Finish += WizardFinished; 

private void WizardFinished(object sender, EventArgs e) 
{ 
    EventHandler handler = Finish; 
    if (handler != null) 
    { 
     handler(this, e); 
    } 
} 

Lợi ích của hình thức thứ hai là nguồn gốc của sự kiện này sau đó dường như là lớp trung gian, không phải là phù thủy - đó là hợp lý vì đó là những gì các trình xử lý đã đăng ký.

+0

Cảm ơn, lý do đằng sau tùy chọn thứ hai là đủ tốt để thực hiện hệ thống theo cách đó. Và cảm ơn cho tùy chọn đầu tiên cũng như tôi đã không nhận ra có một cú pháp cho quá tải thêm. – plouh

+0

Ngoài sự tò mò, tại sao bạn gán Finish cho trình xử lý trước khi thử nghiệm cho null và gọi Finish? – dckrooney

+0

@dcrooney: Điều đó cần phải có trình xử lý yêu cầu thay thế. Sẽ chỉnh sửa. –

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